home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / ld / dist / ld.diff2 < prev    next >
Encoding:
Text File  |  1990-10-26  |  142.1 KB  |  5,130 lines

  1. *** ld.original    Thu Oct 25 22:09:56 1990
  2. --- /tmp/jhh/binutils/ld.c    Thu Jun 21 14:52:49 1990
  3. ***************
  4. *** 23,37 ****
  5. --- 23,60 ----
  6.   #include <sys/types.h>
  7.   #include <sys/stat.h>
  8.   #include <sys/file.h>
  9. + #ifndef USG
  10. + #include <sys/time.h>
  11. + #include <sys/resource.h>
  12. + #endif
  13.   #ifndef sony_news
  14.   #include <fcntl.h>
  15.   #endif
  16.   
  17. + #if !defined(A_OUT) && !defined(MACH_O)
  18. + #define A_OUT
  19. + #endif
  20. + #ifdef A_OUT
  21.   #ifdef COFF_ENCAPSULATE
  22.   #include "a.out.encap.h"
  23.   #else
  24.   #include <a.out.h>
  25.   #endif
  26. + #endif
  27. + #ifdef MACH_O
  28. + #ifndef A_OUT
  29. + #include <nlist.h>
  30. + #include <reloc.h>
  31. + #endif
  32. + #ifndef N_TEXT
  33. + #define N_TEXT 0x04
  34. + #define N_DATA 0x06
  35. + #define N_BSS 0x08
  36. + #endif
  37. + #include <sys/loader.h>
  38. + #endif
  39.   
  40.   #ifndef N_SET_MAGIC
  41.   #define N_SET_MAGIC(exec, val)  ((exec).a_magic = val)
  42. ***************
  43. *** 40,46 ****
  44. --- 63,77 ----
  45.   /* If compiled with GNU C, use the built-in alloca */
  46.   #ifdef __GNUC__
  47.   # define alloca __builtin_alloca
  48. + #else
  49. + # if defined(sun) && defined(sparc)
  50. + #  include "alloca.h"
  51. + # else
  52. + char *alloca ();
  53.   # endif
  54. + #endif
  55. + #include "getopt.h"
  56.   
  57.   /* Always use the GNU version of debugging symbol type codes, if possible.  */
  58.   
  59. ***************
  60. *** 86,102 ****
  61.   /* Define this to specify the default executable format.  */
  62.   
  63.   #ifdef hpux
  64. ! #define DEFAULT_MAGIC NMAGIC  /* hpux bugs screw ZMAGIC */
  65. ! #endif
  66. ! #ifndef DEFAULT_MAGIC
  67. ! #define DEFAULT_MAGIC ZMAGIC
  68.   #endif
  69.   
  70.   /* Ordinary 4.3bsd lacks these macros in a.out.h.  */
  71.   
  72.   #ifndef N_TXTADDR
  73. ! #if defined(vax) || defined(sony_news)
  74.   #define N_TXTADDR(X) 0
  75.   #endif
  76.   #ifdef is68k
  77. --- 117,129 ----
  78.   /* Define this to specify the default executable format.  */
  79.   
  80.   #ifdef hpux
  81. ! #define DEFAULT_OUTPUT_STYLE OUTPUT_READONLY_TEXT
  82.   #endif
  83.   
  84.   /* Ordinary 4.3bsd lacks these macros in a.out.h.  */
  85.   
  86.   #ifndef N_TXTADDR
  87. ! #if defined(vax) || defined(sony_news) || defined(hp300) || defined(pyr)
  88.   #define N_TXTADDR(X) 0
  89.   #endif
  90.   #ifdef is68k
  91. ***************
  92. *** 105,114 ****
  93.   #ifdef sequent
  94.   #define    N_TXTADDR(x) (N_ADDRADJ(x))
  95.   #endif
  96.   #endif
  97.   
  98.   #ifndef N_DATADDR
  99. ! #if defined(vax) || defined(sony_news)
  100.   #define N_DATADDR(x) \
  101.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  102.       : (page_size+((N_TXTADDR(x)+(x).a_text-1) & ~(page_size-1))))
  103. --- 132,144 ----
  104.   #ifdef sequent
  105.   #define    N_TXTADDR(x) (N_ADDRADJ(x))
  106.   #endif
  107. + #ifdef NeXT
  108. + #define N_TXTADDR(X) ((X).a_magic == ZMAGIC ? page_size : 0)
  109. + #endif
  110.   #endif
  111.   
  112.   #ifndef N_DATADDR
  113. ! #if defined(vax) || defined(sony_news) || defined(hp300) || defined(pyr)
  114.   #define N_DATADDR(x) \
  115.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  116.       : (page_size+((N_TXTADDR(x)+(x).a_text-1) & ~(page_size-1))))
  117. ***************
  118. *** 124,130 ****
  119. --- 154,172 ----
  120.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  121.       : (page_size+(((x).a_text-1) & ~(page_size-1))))
  122.   #endif
  123. + #ifdef NeXT
  124. + #define N_DATADDR(X) \
  125. +     (((X).a_magic==ZMAGIC)?(N_TXTADDR(X)+(X).a_text+0xFFFF)&~0xFFFF \
  126. +      :N_TXTADDR(X)+(X).a_text)
  127.   #endif
  128. + #endif
  129. + /* The "address" of the data segment in a relocatable file.
  130. +    The text address of a relocatable file is always
  131. +    considered to be zero (instead of the value of N_TXTADDR, which
  132. +    is what the address is in an executable), so we need to subtract
  133. +    N_TXTADDR from N_DATADDR to get the "address" for the input file.  */
  134. + #define DATA_ADDR_DOT_O(hdr) (N_DATADDR(hdr) - N_TXTADDR(hdr))
  135.   
  136.   /* Define how to initialize system-dependent header fields.  */
  137.   #ifdef sun
  138. ***************
  139. *** 131,144 ****
  140.   #ifdef sparc
  141.   #define INITIALIZE_HEADER \
  142.     {outheader.a_machtype = M_SPARC; outheader.a_toolversion = 1;}
  143. ! #endif
  144. ! #if defined(mc68010) || defined(m68010)
  145. ! #define INITIALIZE_HEADER outheader.a_machtype = M_68010
  146. ! #endif
  147. ! #ifndef INITIALIZE_HEADER
  148. ! #define INITIALIZE_HEADER outheader.a_machtype = M_68020
  149. ! #endif
  150. ! #endif
  151.   #ifdef ALTOS
  152.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_68020)
  153.   #endif
  154. --- 173,195 ----
  155.   #ifdef sparc
  156.   #define INITIALIZE_HEADER \
  157.     {outheader.a_machtype = M_SPARC; outheader.a_toolversion = 1;}
  158. ! #endif /* sparc.  */
  159. ! #if defined(mc68000)
  160. ! /* Set the machine type according to the machine type of the .o files.
  161. !    If they are all sun2 (68010), then the type of the executable is sun2.
  162. !    If any is sun3 (68020), then the type of the executable is sun3.
  163. !    This is consistent with the Sun loader and more useful than having
  164. !    it depend on which machine you are on when you run ld.  */
  165. ! static int sun_machtype = M_68010;
  166. ! #define INITIALIZE_HEADER outheader.a_machtype = sun_machtype
  167. ! #define READ_HEADER_HOOK(machtype) \
  168. !   if (machtype == M_68020)           \
  169. !     {                     \
  170. !       sun_machtype = M_68020;         \
  171. !     }
  172. ! #endif /* mc68000.  */
  173. ! #endif /* Sun.  */
  174.   #ifdef ALTOS
  175.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_68020)
  176.   #endif
  177. ***************
  178. *** 155,161 ****
  179.   #endif
  180.   #if defined(i386) && !defined(sequent)
  181.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_386)
  182. ! #endif
  183.   
  184.   #ifdef is68k
  185.   /* This enables code to take care of an ugly hack in the ISI OS.
  186. --- 206,218 ----
  187.   #endif
  188.   #if defined(i386) && !defined(sequent)
  189.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_386)
  190. ! #endif /* Sequent symmetry.  */
  191. ! #if defined(hp300)
  192. ! #define INITIALIZE_HEADER outheader.a_mid = MID_HP300
  193. ! #endif /* hp300.  */
  194. ! #ifdef pyr
  195. ! #define INITIALIZE_HEADER outheader.a_machid = PYR90X
  196. ! #endif /* Pyramid.  */
  197.   
  198.   #ifdef is68k
  199.   /* This enables code to take care of an ugly hack in the ISI OS.
  200. ***************
  201. *** 164,179 ****
  202.   #define DOLLAR_KLUDGE
  203.   #endif
  204.   
  205. ! /*
  206. !  * Alloca include.
  207. !  */
  208. ! #if defined(sun) && defined(sparc) && !defined(__GNUC__)
  209. ! #include "alloca.h"
  210. ! #endif
  211.   #ifndef L_SET
  212.   #define L_SET 0
  213.   #endif
  214.   
  215.   /*
  216.    * Ok.  Following are the relocation information macros.  If your
  217. --- 221,234 ----
  218.   #define DOLLAR_KLUDGE
  219.   #endif
  220.   
  221. ! /* Values for 3rd argument to lseek().  */
  222.   #ifndef L_SET
  223.   #define L_SET 0
  224.   #endif
  225. + /* This is called L_INCR in BSD, but SEEK_CUR in POSIX.  */
  226. + #ifndef SEEK_CUR
  227. + #define SEEK_CUR 1
  228. + #endif
  229.   
  230.   /*
  231.    * Ok.  Following are the relocation information macros.  If your
  232. ***************
  233. *** 193,199 ****
  234.    * what the value of the relocation actually was.  *Must be an lvalue*.
  235.    *
  236.    *   RELOC_TYPE (rval): For a non-external relocation, this is the
  237. !  * segment to relocate for.
  238.    *
  239.    *   RELOC_SYMBOL (rval): For an external relocation, this is the
  240.    * index of its symbol in the symbol table.  *Must be an lvalue*.
  241. --- 248,254 ----
  242.    * what the value of the relocation actually was.  *Must be an lvalue*.
  243.    *
  244.    *   RELOC_TYPE (rval): For a non-external relocation, this is the
  245. !  * segment to relocate for.  *Must be an lvalue.*
  246.    *
  247.    *   RELOC_SYMBOL (rval): For an external relocation, this is the
  248.    * index of its symbol in the symbol table.  *Must be an lvalue*.
  249. ***************
  250. *** 502,508 ****
  251.         /* Nonzero means definitions of this symbol as common have been seen,
  252.        and the value here is the largest size specified by any of them.  */
  253.         int max_common_size;
  254. !       /* For relocatable_output, records the index of this global sym in the
  255.        symbol table to be written, with the first global sym given index 0.*/
  256.         int def_count;
  257.         /* Nonzero means a definition of this global symbol is known to exist.
  258. --- 557,563 ----
  259.         /* Nonzero means definitions of this symbol as common have been seen,
  260.        and the value here is the largest size specified by any of them.  */
  261.         int max_common_size;
  262. !       /* For OUTPUT_RELOCATABLE, records the index of this global sym in the
  263.        symbol table to be written, with the first global sym given index 0.*/
  264.         int def_count;
  265.         /* Nonzero means a definition of this global symbol is known to exist.
  266. ***************
  267. *** 530,535 ****
  268. --- 585,599 ----
  269.       }
  270.     symbol;
  271.   
  272. + /* Demangler for C++.  */
  273. + extern char *cplus_demangle ();
  274. + /* Demangler function to use.  We unconditionally enable the C++ demangler
  275. +    because we assume any name it successfully demangles was probably produced
  276. +    by the C++ compiler.  Enabling it only if -lg++ was specified seems too
  277. +    much of a kludge.  */
  278. + char *(*demangler)() = cplus_demangle;
  279.   /* Number of buckets in symbol hash table */
  280.   #define    TABSIZE    1009
  281.   
  282. ***************
  283. *** 611,620 ****
  284. --- 675,694 ----
  285.      -e sets this.  */
  286.   symbol *entry_symbol;
  287.   
  288. + /* These can be NULL if we don't actually have such a symbol.  */
  289.   symbol *edata_symbol;   /* the symbol _edata */
  290.   symbol *etext_symbol;   /* the symbol _etext */
  291.   symbol *end_symbol;    /* the symbol _end */
  292. + /* We also need __{edata,etext,end} so that they can safely
  293. +    be used from an ANSI library.  */
  294. + symbol *edata_symbol_alt;
  295. + symbol *etext_symbol_alt;
  296. + symbol *end_symbol_alt;
  297.   
  298. + /* Kinds of files potentially understood by the linker. */
  299. + enum file_type { IS_UNKNOWN, IS_ARCHIVE, IS_A_OUT, IS_MACH_O };
  300.   /* Each input file, and each library member ("subfile") being loaded,
  301.      has a `file_entry' structure for it.
  302.   
  303. ***************
  304. *** 630,659 ****
  305.   struct file_entry {
  306.     /* Name of this file.  */
  307.     char *filename;
  308.     /* Name to use for the symbol giving address of text start */
  309.     /* Usually the same as filename, but for a file spec'd with -l
  310.        this is the -l switch itself rather than the filename.  */
  311.     char *local_sym_name;
  312.   
  313. !   /* Describe the layout of the contents of the file */
  314.   
  315. !   /* The file's a.out header.  */
  316. !   struct exec header;
  317. !   /* Offset in file of GDB symbol segment, or 0 if there is none.  */
  318. !   int symseg_offset;
  319.   
  320.     /* Describe data from the file loaded into core */
  321.   
  322.     /* Symbol table of the file.  */
  323.     struct nlist *symbols;
  324. !   /* Size in bytes of string table.  */
  325. !   int string_size;
  326.     /* Pointer to the string table.
  327.        The string table is not kept in core all the time,
  328.        but when it is in core, its address is here.  */
  329.     char *strings;
  330.   
  331. !   /* Next two used only if `relocatable_output' or if needed for */
  332.     /* output of undefined reference line numbers. */
  333.   
  334.     /* Text reloc info saved by `write_text' for `coptxtrel'.  */
  335. --- 704,771 ----
  336.   struct file_entry {
  337.     /* Name of this file.  */
  338.     char *filename;
  339. +   /* What kind of file this is. */
  340. +   enum file_type file_type;
  341.     /* Name to use for the symbol giving address of text start */
  342.     /* Usually the same as filename, but for a file spec'd with -l
  343.        this is the -l switch itself rather than the filename.  */
  344.     char *local_sym_name;
  345.   
  346. !   /* Describe the layout of the contents of the file.  */
  347.   
  348. !   /* The text section. */
  349. !   unsigned long int orig_text_address;
  350. !   unsigned long int text_size;
  351. !   long int text_offset;
  352. !   /* Text relocation. */
  353. !   unsigned long int text_reloc_size;
  354. !   long int text_reloc_offset;
  355. !   /* The data section. */
  356. !   unsigned long int orig_data_address;
  357. !   unsigned long int data_size;
  358. !   long int data_offset;
  359. !   /* Data relocation. */
  360. !   unsigned long int data_reloc_size;
  361. !   long int data_reloc_offset;
  362. !   /* The bss section. */
  363. !   unsigned long int orig_bss_address;
  364. !   unsigned long int bss_size;
  365. !   /* The symbol and string tables. */
  366. !   unsigned long int syms_size;
  367. !   long int syms_offset;
  368. !   unsigned long int strs_size;
  369. !   long int strs_offset;
  370. !   /* The GDB symbol segment, if any. */
  371. !   unsigned long int symseg_size;
  372. !   long int symseg_offset;
  373. ! #ifdef MACH_O
  374. !   /* Section ordinals from the Mach-O load commands.  These
  375. !      are compared with the n_sect fields of symbols.  */
  376. !   int text_ordinal;
  377. !   int data_ordinal;
  378. !   int bss_ordinal;
  379. ! #endif
  380.   
  381.     /* Describe data from the file loaded into core */
  382.   
  383.     /* Symbol table of the file.  */
  384.     struct nlist *symbols;
  385.     /* Pointer to the string table.
  386.        The string table is not kept in core all the time,
  387.        but when it is in core, its address is here.  */
  388.     char *strings;
  389.   
  390. !   /* Next two used only if OUTPUT_RELOCATABLE or if needed for */
  391.     /* output of undefined reference line numbers. */
  392.   
  393.     /* Text reloc info saved by `write_text' for `coptxtrel'.  */
  394. ***************
  395. *** 724,751 ****
  396.   
  397.   char *output_filename;
  398.   
  399. ! /* Descriptor for writing that file with `mywrite'.  */
  400. ! int outdesc;
  401.   
  402. ! /* Header for that file (filled in by `write_header').  */
  403.   
  404. ! struct exec outheader;
  405.   
  406. ! #ifdef COFF_ENCAPSULATE
  407. ! struct coffheader coffheader;
  408. ! int need_coff_header;
  409.   #endif
  410.   
  411.   /* The following are computed by `digest_symbols'.  */
  412.   
  413.   int text_size;        /* total size of text of all input files.  */
  414.   int data_size;        /* total size of data of all input files.  */
  415.   int bss_size;        /* total size of bss of all input files.  */
  416.   int text_reloc_size;    /* total size of text relocation of all input files.  */
  417. ! int data_reloc_size;    /* total size of data relocation of all input */
  418. !             /* files.  */
  419.   
  420.   /* Specifications of start and length of the area reserved at the end
  421.      of the text segment for the set vectors.  Computed in 'digest_symbols' */
  422.   int set_sect_start;
  423. --- 836,906 ----
  424.   
  425.   char *output_filename;
  426.   
  427. ! /* What kind of output file to write.  */
  428.   
  429. ! enum file_type output_file_type;
  430.   
  431. ! #ifndef DEFAULT_OUTPUT_FILE_TYPE
  432. ! #ifdef MACH_O
  433. ! #define DEFAULT_OUTPUT_FILE_TYPE IS_MACH_O
  434. ! #else
  435. ! #define DEFAULT_OUTPUT_FILE_TYPE IS_A_OUT
  436. ! #endif
  437. ! #endif
  438. ! /* What `style' of output file to write.  For BSD a.out files
  439. !    this specifies OMAGIC, NMAGIC, or ZMAGIC.  For Mach-O files
  440. !    this switches between MH_OBJECT and two flavors of MH_EXECUTE.  */
  441. ! enum output_style
  442. !   {
  443. !     OUTPUT_UNSPECIFIED,
  444. !     OUTPUT_RELOCATABLE,        /* -r */
  445. !     OUTPUT_WRITABLE_TEXT,    /* -N */
  446. !     OUTPUT_READONLY_TEXT,    /* -n */
  447. !     OUTPUT_DEMAND_PAGED        /* -Z (default) */
  448. !   };
  449. ! enum output_style output_style;
  450.   
  451. ! #ifndef DEFAULT_OUTPUT_STYLE
  452. ! #define DEFAULT_OUTPUT_STYLE OUTPUT_DEMAND_PAGED
  453.   #endif
  454.   
  455. + /* Descriptor for writing that file with `mywrite'.  */
  456. + int outdesc;
  457.   /* The following are computed by `digest_symbols'.  */
  458.   
  459.   int text_size;            /* total size of text of all input files.  */
  460. + int text_header_size;        /* size of the file header if included in the
  461. +                    text size.  */
  462.   int data_size;            /* total size of data of all input files.  */
  463.   int bss_size;            /* total size of bss of all input files.  */
  464.   int text_reloc_size;        /* total size of text relocation of all input files.  */
  465. ! int data_reloc_size;        /* total size of data relocation of all input
  466. !                    files.  */
  467.     
  468. + /* The following are computed by write_header().  */
  469. + long int output_text_offset;    /* file offset of the text section.  */
  470. + long int output_data_offset;    /* file offset of the data section.  */
  471. + long int output_trel_offset;    /* file offset of the text relocation info.  */
  472. + long int output_drel_offset;    /* file offset of the data relocation info.  */
  473. + long int output_syms_offset;    /* file offset of the symbol table.  */
  474. + long int output_strs_offset;    /* file offset of the string table.  */
  475. + /* The following are incrementally computed by write_syms(); we keep
  476. +    them here so we can examine their values afterwards.  */
  477. + unsigned int output_syms_size;    /* total bytes of symbol table output. */
  478. + unsigned int output_strs_size;    /* total bytes of string table output. */
  479. + /* This can only be computed after the size of the string table is known.  */
  480. + long int output_symseg_offset;    /* file offset of the symbol segment (if any).  */
  481. + /* Incrementally computed by write_file_symseg().  */
  482. + unsigned int output_symseg_size;
  483.   /* Specifications of start and length of the area reserved at the end
  484.      of the text segment for the set vectors.  Computed in 'digest_symbols' */
  485.   int set_sect_start;
  486. ***************
  487. *** 755,766 ****
  488.      written. */
  489.   unsigned long *set_vectors;
  490.   
  491. ! /* Amount of cleared space to leave between the text and data segments.  */
  492.   
  493.   int text_pad;
  494.   
  495. ! /* Amount of bss segment to include as part of the data segment.  */
  496.   int data_pad;
  497.   
  498.   /* Format of __.SYMDEF:
  499. --- 910,922 ----
  500.      written. */
  501.   unsigned long *set_vectors;
  502.   
  503. ! /* Amount of cleared space to leave at the end of the text segment.  */
  504.   
  505.   int text_pad;
  506.   
  507. ! /* Amount of padding at end of data segment.  This has two parts:
  508. !    That which is before the bss segment, and that which overlaps
  509. !    with the bss segment.  */
  510.   int data_pad;
  511.   
  512.   /* Format of __.SYMDEF:
  513. ***************
  514. *** 781,796 ****
  515.      write any padding in the output file for it.  */
  516.   int text_start;
  517.   
  518. - /* Offset of default entry-pc within the text section.  */
  519. - int entry_offset;
  520.   /* Address we decide the data section will be loaded at.  */
  521.   int data_start;
  522.   
  523. - /* `text-start' address is normally this much plus a page boundary.
  524. -    This is not a user option; it is fixed for each system.  */
  525. - int text_start_alignment;
  526.   /* Nonzero if -T was specified in the command line.
  527.      This prevents text_start from being set later to default values.  */
  528.   int T_flag_specified;
  529. --- 937,945 ----
  530. ***************
  531. *** 804,812 ****
  532.      and reduce the size of the bss section to match.  */
  533.   int specified_data_size;
  534.   
  535. - /* Magic number to use for the output file, set by switch.  */
  536. - int magic;
  537.   /* Nonzero means print names of input files as processed.  */
  538.   int trace_files;
  539.   
  540. --- 953,958 ----
  541. ***************
  542. *** 822,831 ****
  543.   /* 1 => write load map.  */
  544.   int write_map;
  545.   
  546. ! /* 1 => write relocation into output file so can re-input it later.  */
  547. ! int relocatable_output;
  548. ! /* 1 => assign space to common symbols even if `relocatable_output'.  */
  549.   int force_common_definition;
  550.   
  551.   /* Standard directories to search for files specified by -l.  */
  552. --- 968,974 ----
  553.   /* 1 => write load map.  */
  554.   int write_map;
  555.   
  556. ! /* 1 => assign space to common symbols even if OUTPUT_RELOCATABLE. */
  557.   int force_common_definition;
  558.   
  559.   /* Standard directories to search for files specified by -l.  */
  560. ***************
  561. *** 840,845 ****
  562. --- 983,991 ----
  563.   #endif
  564.   #endif
  565.   
  566. + /* If set STANDARD_SEARCH_DIRS is not searched.  */
  567. + int no_standard_dirs;
  568.   /* Actual vector of directories to search;
  569.      this contains those specified with -L plus the standard ones.  */
  570.   char **search_dirs;
  571. ***************
  572. *** 847,854 ****
  573.   /* Length of the vector `search_dirs'.  */
  574.   int n_search_dirs;
  575.   
  576. ! /* Non zero means to create the output executable. */
  577. ! /* Cleared by nonfatal errors.  */
  578.   int make_executable;
  579.   
  580.   /* Force the executable to be output, even if there are non-fatal
  581. --- 993,1000 ----
  582.   /* Length of the vector `search_dirs'.  */
  583.   int n_search_dirs;
  584.   
  585. ! /* Non zero means to create the output executable.
  586. !    Cleared by nonfatal errors.  */
  587.   int make_executable;
  588.   
  589.   /* Force the executable to be output, even if there are non-fatal
  590. ***************
  591. *** 861,875 ****
  592.   struct glosym **cmdline_references;
  593.   int cl_refs_allocated;
  594.   
  595.   void bcopy (), bzero ();
  596. - int malloc (), realloc ();
  597. - #ifndef alloca
  598. - int alloca ();
  599.   #endif
  600. ! int free ();
  601.   
  602. ! int xmalloc ();
  603. ! int xrealloc ();
  604.   void fatal ();
  605.   void fatal_with_file ();
  606.   void perror_name ();
  607. --- 1007,1021 ----
  608.   struct glosym **cmdline_references;
  609.   int cl_refs_allocated;
  610.   
  611. + #ifndef bcopy
  612.   void bcopy (), bzero ();
  613.   #endif
  614. ! char *malloc (), *realloc ();
  615. ! void free ();
  616.   
  617. ! char *xmalloc ();
  618. ! char *xrealloc ();
  619. ! void usage ();
  620.   void fatal ();
  621.   void fatal_with_file ();
  622.   void perror_name ();
  623. ***************
  624. *** 876,881 ****
  625. --- 1022,1030 ----
  626.   void perror_file ();
  627.   void error ();
  628.   
  629. + int parse ();
  630. + void initialize_text_start ();
  631. + void initialize_data_start ();
  632.   void digest_symbols ();
  633.   void print_symbols ();
  634.   void load_symbols ();
  635. ***************
  636. *** 905,910 ****
  637. --- 1054,1070 ----
  638.     page_size = getpagesize ();
  639.     progname = argv[0];
  640.   
  641. + #ifdef RLIMIT_STACK
  642. +   /* Avoid dumping core on large .o files.  */
  643. +   {
  644. +     struct rlimit rl;
  645. +     getrlimit (RLIMIT_STACK, &rl);
  646. +     rl.rlim_cur = rl.rlim_max;
  647. +     setrlimit (RLIMIT_STACK, &rl);
  648. +   }
  649. + #endif
  650.     /* Clear the cumulative info on the output file.  */
  651.   
  652.     text_size = 0;
  653. ***************
  654. *** 924,934 ****
  655.     discard_locals = DISCARD_NONE;
  656.     entry_symbol = 0;
  657.     write_map = 0;
  658. -   relocatable_output = 0;
  659.     force_common_definition = 0;
  660.     T_flag_specified = 0;
  661.     Tdata_flag_specified = 0;
  662. -   magic = DEFAULT_MAGIC;
  663.     make_executable = 1;
  664.     force_executable = 0;
  665.     set_element_prefixes = 0;
  666. --- 1084,1092 ----
  667. ***************
  668. *** 947,952 ****
  669. --- 1105,1111 ----
  670.     common_defined_global_count = 0;
  671.   
  672.     /* Keep a list of symbols referenced from the command line */
  673.     cl_refs_allocated = 10;
  674.     cmdline_references
  675.       = (struct glosym **) xmalloc (cl_refs_allocated
  676. ***************
  677. *** 957,1004 ****
  678.   
  679.     decode_command (argc, argv);
  680.   
  681. -   /* Create the symbols `etext', `edata' and `end'.  */
  682. -   if (!relocatable_output)
  683. -     symtab_init ();
  684. -   /* Determine whether to count the header as part of
  685. -      the text size, and initialize the text size accordingly.
  686. -      This depends on the kind of system and on the output format selected.  */
  687. -   N_SET_MAGIC (outheader, magic);
  688. - #ifdef INITIALIZE_HEADER
  689. -   INITIALIZE_HEADER;
  690. - #endif
  691. -   text_size = sizeof (struct exec);
  692. - #ifdef COFF_ENCAPSULATE
  693. -   if (relocatable_output == 0)
  694. -     {
  695. -       need_coff_header = 1;
  696. -       /* set this flag now, since it will change the values of N_TXTOFF, etc */
  697. -       N_SET_FLAGS (outheader, N_FLAGS_COFF_ENCAPSULATE);
  698. -       text_size += sizeof (struct coffheader);
  699. -     }
  700. - #endif
  701. -   text_size -= N_TXTOFF (outheader);
  702. -   if (text_size < 0)
  703. -     text_size = 0;
  704. -   entry_offset = text_size;
  705. -   if (!T_flag_specified && !relocatable_output)
  706. -     text_start = N_TXTADDR (outheader);
  707. -   /* The text-start address is normally this far past a page boundary.  */
  708. -   text_start_alignment = text_start % page_size;
  709.     /* Load symbols of all input files.
  710.        Also search all libraries and decide which library members to load.  */
  711.   
  712.     load_symbols ();
  713.   
  714.     /* Compute where each file's sections go, and relocate symbols.  */
  715.   
  716.     digest_symbols ();
  717. --- 1116,1133 ----
  718.   
  719.     decode_command (argc, argv);
  720.   
  721.     /* Load symbols of all input files.
  722.        Also search all libraries and decide which library members to load.  */
  723.   
  724.     load_symbols ();
  725.   
  726. +   /* Create various built-in symbols.  This must occur after
  727. +      all input files are loaded so that a user program can have a
  728. +      symbol named etext (for example).  */
  729. +   if (output_style != OUTPUT_RELOCATABLE)
  730. +     symtab_init ();
  731.     /* Compute where each file's sections go, and relocate symbols.  */
  732.   
  733.     digest_symbols ();
  734. ***************
  735. *** 1020,1072 ****
  736.     exit (!make_executable);
  737.   }
  738.   
  739. ! void decode_option ();
  740.   
  741. ! /* Analyze a command line argument.
  742. !    Return 0 if the argument is a filename.
  743. !    Return 1 if the argument is a option complete in itself.
  744. !    Return 2 if the argument is a option which uses an argument.
  745. !    Thus, the value is the number of consecutive arguments
  746. !    that are part of options.  */
  747. ! int
  748. ! classify_arg (arg)
  749. !      register char *arg;
  750. ! {
  751. !   if (*arg != '-') return 0;
  752. !   switch (arg[1])
  753.       {
  754. !     case 'A':
  755. !     case 'D':
  756. !     case 'e':
  757. !     case 'L':
  758. !     case 'l':
  759. !     case 'o':
  760. !     case 'u':
  761. !     case 'V':
  762. !     case 'y':
  763. !       if (arg[2])
  764. !     return 1;
  765. !       return 2;
  766. !     case 'B':
  767. !       if (! strcmp (&arg[2], "static"))
  768. !     return 1;
  769. !     case 'T':
  770. !       if (arg[2] == 0)
  771. !     return 2;
  772. !       if (! strcmp (&arg[2], "text"))
  773. !     return 2;
  774. !       if (! strcmp (&arg[2], "data"))
  775. !     return 2;
  776. !       return 1;
  777. !     }
  778.   
  779. -   return 1;
  780. - }
  781.   /* Process the command arguments,
  782.      setting up file_table with an entry for each input file,
  783.      and setting variables according to the options.  */
  784. --- 1149,1191 ----
  785.     exit (!make_executable);
  786.   }
  787.   
  788. ! void add_cmdline_ref ();
  789.   
  790. ! static struct option longopts[] =
  791.   {
  792. !   {"d", 0, 0, 'd'},
  793. !   {"dc", 0, 0, 'd'},        /* For Sun compatibility. */
  794. !   {"dp", 0, 0, 'd'},        /* For Sun compatibility. */
  795. !   {"e", 1, 0, 'e'},
  796. !   {"n", 0, 0, 'n'},
  797. !   {"noinhibit-exec", 0, 0, 130},
  798. !   {"nostdlib", 0, 0, 133},
  799. !   {"o", 1, 0, 'o'},
  800. !   {"r", 0, 0, 'r'},
  801. !   {"s", 0, 0, 's'},
  802. !   {"t", 0, 0, 't'},
  803. !   {"u", 1, 0, 'u'},
  804. !   {"x", 0, 0, 'x'},
  805. !   {"z", 0, 0, 'z'},
  806. !   {"A", 1, 0, 'A'},
  807. !   {"Bstatic", 0, 0, 129},    /* For Sun compatibility. */
  808. !   {"D", 1, 0, 'D'},
  809. !   {"M", 0, 0, 'M'},
  810. !   {"N", 0, 0, 'N'},
  811. !   {"S", 0, 0, 'S'},
  812. !   {"T", 1, 0, 'T'},
  813. !   {"Ttext", 1, 0, 'T'},
  814. !   {"Tdata", 1, 0, 132},
  815. !   {"V", 1, 0, 'V'},
  816. !   {"X", 0, 0, 'X'},
  817. !   {0, 0, 0, 0}
  818. ! };
  819. ! /* Since the Unix ld accepts -lfoo, -Lfoo, and -yfoo, we must also.
  820. !    This effectively prevents any long options from starting with
  821. !    one of these letters. */
  822. ! #define SHORTOPTS "-l:y:L:"
  823.   
  824.   /* Process the command arguments,
  825.      setting up file_table with an entry for each input file,
  826.      and setting variables according to the options.  */
  827. ***************
  828. *** 1076,1082 ****
  829.        char **argv;
  830.        int argc;
  831.   {
  832. !   register int i;
  833.     register struct file_entry *p;
  834.   
  835.     number_of_files = 0;
  836. --- 1195,1201 ----
  837.        char **argv;
  838.        int argc;
  839.   {
  840. !   int optc, longind;
  841.     register struct file_entry *p;
  842.   
  843.     number_of_files = 0;
  844. ***************
  845. *** 1085,1172 ****
  846.     n_search_dirs = 0;
  847.     search_dirs = (char **) xmalloc (sizeof (char *));
  848.   
  849. !   /* First compute number_of_files so we know how long to make file_table.  */
  850. !   /* Also process most options completely.  */
  851.   
  852. !   for (i = 1; i < argc; i++)
  853.       {
  854. !       register int code = classify_arg (argv[i]);
  855. !       if (code)
  856. !     {
  857. !       if (i + code > argc)
  858. !         fatal ("no argument following %s\n", argv[i]);
  859.   
  860. !       decode_option (argv[i], argv[i+1]);
  861.   
  862. !       if (argv[i][1] == 'l' || argv[i][1] == 'A')
  863.           number_of_files++;
  864.   
  865. !       i += code - 1;
  866.       }
  867. !       else
  868.       number_of_files++;
  869.       }
  870.   
  871.     if (!number_of_files)
  872. !     fatal ("no input files", 0);
  873.   
  874.     p = file_table
  875.       = (struct file_entry *) xmalloc (number_of_files * sizeof (struct file_entry));
  876.     bzero (p, number_of_files * sizeof (struct file_entry));
  877.   
  878. !   /* Now scan again and fill in file_table.  */
  879. !   /* All options except -A and -l are ignored here.  */
  880.   
  881. !   for (i = 1; i < argc; i++)
  882. !     {
  883. !       register int code = classify_arg (argv[i]);
  884.   
  885. !       if (code)
  886.       {
  887. !       char *string;
  888. !       if (code == 2)
  889. !         string = argv[i+1];
  890. !       else
  891. !         string = &argv[i][2];
  892.   
  893. !       if (argv[i][1] == 'A')
  894. !         {
  895.             if (p != file_table)
  896. !         fatal ("-A specified before an input file other than the first");
  897. !           p->filename = string;
  898. !           p->local_sym_name = string;
  899.             p->just_syms_flag = 1;
  900.             p++;
  901. !         }
  902. !       if (argv[i][1] == 'l')
  903. !         {
  904. !           p->filename = concat ("lib", string, ".a");
  905. !           p->local_sym_name = concat ("-l", string, "");
  906.             p->search_dirs_flag = 1;
  907.             p++;
  908. !         }
  909. !       i += code - 1;
  910. !     }
  911. !       else
  912. !     {
  913. !       p->filename = argv[i];
  914. !       p->local_sym_name = argv[i];
  915. !       p++;
  916.       }
  917.       }
  918.   
  919.     /* Now check some option settings for consistency.  */
  920.   
  921. ! #ifdef NMAGIC
  922. !   if ((magic == ZMAGIC || magic == NMAGIC)
  923. ! #else
  924. !   if ((magic == ZMAGIC)
  925. ! #endif
  926.         && (text_start - text_start_alignment) & (page_size - 1))
  927. !     fatal ("-T argument not multiple of page size, with sharable output", 0);
  928.   
  929.     /* Append the standard search directories to the user-specified ones.  */
  930.     {
  931.       int n = sizeof standard_search_dirs / sizeof standard_search_dirs[0];
  932.       n_search_dirs += n;
  933. --- 1204,1429 ----
  934.     n_search_dirs = 0;
  935.     search_dirs = (char **) xmalloc (sizeof (char *));
  936.   
  937. !   /* First compute number_of_files so we know how long to make file_table.
  938. !      Also process most options completely.  */
  939.   
  940. !   while ((optc = getopt_long_only (argc, argv, SHORTOPTS, longopts, &longind))
  941. !      != EOF)
  942. !     {
  943. !       if (optc == 0)
  944. !     optc = longopts[longind].val;
  945. !       switch (optc)
  946.       {
  947. !     case '?':
  948. !       usage (0, 0);
  949. !       break;
  950. !     case 1:
  951. !       /* Non-option argument. */
  952. !       number_of_files++;
  953. !       break;
  954. !     case 'd':
  955. !       force_common_definition = 1;
  956. !       break;
  957.   
  958. !     case 'e':
  959. !       entry_symbol = getsym (optarg);
  960. !       if (!entry_symbol->defined && !entry_symbol->referenced)
  961. !         undefined_global_sym_count++;
  962. !       entry_symbol->referenced = 1;
  963. !       add_cmdline_ref (entry_symbol);
  964. !       break;
  965.   
  966. !     case 'l':
  967.         number_of_files++;
  968. +       break;
  969. +     case 'n':
  970. +       if (output_style && output_style != OUTPUT_READONLY_TEXT)
  971. +         fatal ("illegal combination of -n with -N, -r, or -z", (char *) 0);
  972. +       output_style = OUTPUT_READONLY_TEXT;
  973. +       break;
  974. +     case 130:        /* -noinhibit-exec */
  975. +       force_executable = 1;
  976. +       break;
  977. +     case 133:        /* -nostdlib */
  978. +       no_standard_dirs = 1;
  979. +       break;
  980. +     case 'o':
  981. +       output_filename = optarg;
  982. +       break;
  983. +     case 'r':
  984. +       if (output_style && output_style != OUTPUT_RELOCATABLE)
  985. +         fatal ("illegal combination of -r with -N, -n, or -z", (char *) 0);
  986. +       output_style = OUTPUT_RELOCATABLE;
  987. +       text_start = 0;
  988. +       break;
  989. +     case 's':
  990. +       strip_symbols = STRIP_ALL;
  991. +       break;
  992. +     case 't':
  993. +       trace_files = 1;
  994. +       break;
  995. +     case 'u':
  996. +       {
  997. +         register symbol *sp = getsym (optarg);
  998.   
  999. !         if (!sp->defined && !sp->referenced)
  1000. !           undefined_global_sym_count++;
  1001. !         sp->referenced = 1;
  1002. !         add_cmdline_ref (sp);
  1003.         }
  1004. !       break;
  1005. !     case 'x':
  1006. !       discard_locals = DISCARD_ALL;
  1007. !       break;
  1008. !       
  1009. !     case 'y':
  1010. !       {
  1011. !         register symbol *sp = getsym (optarg);
  1012. !         sp->trace = 1;
  1013. !       }
  1014. !       break;
  1015. !     case 'z':
  1016. !       if (output_style && output_style != OUTPUT_DEMAND_PAGED)
  1017. !         fatal ("illegal combination of -z with -N, -n, or -r", (char *) 0);
  1018. !       output_style = OUTPUT_DEMAND_PAGED;
  1019. !       break;
  1020. !     case 'A':
  1021.         number_of_files++;
  1022. +       break;
  1023. +     case 129:        /* -Bstatic. */
  1024. +       /* Ignore. */
  1025. +       break;
  1026. +     case 'D':
  1027. +       specified_data_size = parse (optarg, "%x", "invalid argument to -D");
  1028. +       break;
  1029. +     case 'L':
  1030. +       n_search_dirs++;
  1031. +       search_dirs = (char **)
  1032. +         xrealloc (search_dirs, n_search_dirs * sizeof (char *));
  1033. +       search_dirs[n_search_dirs - 1] = optarg;
  1034. +       break;
  1035. +       
  1036. +     case 'M':
  1037. +       write_map = 1;
  1038. +       break;
  1039. +     case 'N':
  1040. +       if (output_style && output_style != OUTPUT_WRITABLE_TEXT)
  1041. +         fatal ("illegal combination of -N with -n, -r, or -z", (char *) 0);
  1042. +       output_style = OUTPUT_WRITABLE_TEXT;
  1043. +       break;
  1044. +     case 'S':
  1045. +       strip_symbols = STRIP_DEBUGGER;
  1046. +       break;
  1047. +     case 'T':
  1048. +       text_start = parse (optarg, "%x", "invalid argument to -Ttext");
  1049. +       T_flag_specified = 1;
  1050. +       break;
  1051. +     case 132:        /* -Tdata addr */
  1052. +       data_start = parse (optarg, "%x", "invalid argument to -Tdata");
  1053. +       Tdata_flag_specified = 1;
  1054. +       break;
  1055. +     case 'V':
  1056. +       {
  1057. +         struct string_list_element *new
  1058. +           = (struct string_list_element *)
  1059. +         xmalloc (sizeof (struct string_list_element));
  1060. +         
  1061. +         new->str = optarg;
  1062. +         new->next = set_element_prefixes;
  1063. +         set_element_prefixes = new;
  1064. +       }
  1065. +       break;
  1066. +     case 'X':
  1067. +       discard_locals = DISCARD_L;
  1068. +       break;
  1069.       }
  1070. +     }
  1071.   
  1072.     if (!number_of_files)
  1073. !     usage ("no input files", 0);
  1074.   
  1075.     p = file_table
  1076.       = (struct file_entry *) xmalloc (number_of_files * sizeof (struct file_entry));
  1077.     bzero (p, number_of_files * sizeof (struct file_entry));
  1078.   
  1079. !   /* Now scan again and fill in file_table.
  1080. !      All options except -A and -l are ignored here.  */
  1081.   
  1082. !   optind = 0;            /* Reset getopt. */
  1083. !   while ((optc = getopt_long_only (argc, argv, SHORTOPTS, longopts, &longind))
  1084. !      != EOF)
  1085. !     {
  1086. !       if (optc == 0)
  1087. !     optc = longopts[longind].val;
  1088.   
  1089. !       switch (optc)
  1090.       {
  1091. !     case 1:
  1092. !       /* Non-option argument. */
  1093. !       p->filename = optarg;
  1094. !       p->local_sym_name = optarg;
  1095. !       p++;
  1096. !       break;
  1097.   
  1098. !     case 'A':
  1099.         if (p != file_table)
  1100. !         usage ("-A specified before an input file other than the first");
  1101. !       p->filename = optarg;
  1102. !       p->local_sym_name = optarg;
  1103.         p->just_syms_flag = 1;
  1104.         p++;
  1105. !       break;
  1106. !     case 'l':
  1107. !       p->filename = concat ("lib", optarg, ".a");
  1108. !       p->local_sym_name = concat ("-l", optarg, "");
  1109.         p->search_dirs_flag = 1;
  1110.         p++;
  1111. !       break;
  1112.       }
  1113.       }
  1114.   
  1115. +   if (!output_file_type)
  1116. +     output_file_type = DEFAULT_OUTPUT_FILE_TYPE;
  1117. +   if (!output_style)
  1118. +     output_style = DEFAULT_OUTPUT_STYLE;
  1119. + #if 0
  1120. +   /* THIS CONSISTENCY CHECK BELONGS SOMEWHERE ELSE.  */
  1121.     /* Now check some option settings for consistency.  */
  1122.   
  1123. !   if ((output_style == OUTPUT_READONLY_TEXT || output_style == OUTPUT_DEMAND_PAGED)
  1124.         && (text_start - text_start_alignment) & (page_size - 1))
  1125. !     usage ("-T argument not multiple of page size, with sharable output", 0);
  1126. ! #endif
  1127.   
  1128.     /* Append the standard search directories to the user-specified ones.  */
  1129. +   if (!no_standard_dirs)
  1130.       {
  1131.         int n = sizeof standard_search_dirs / sizeof standard_search_dirs[0];
  1132.         n_search_dirs += n;
  1133. ***************
  1134. *** 1221,1384 ****
  1135.       }
  1136.     return 0;
  1137.   }
  1138. - int parse ();
  1139. - /* Record an option and arrange to act on it later.
  1140. -    ARG should be the following command argument,
  1141. -    which may or may not be used by this option.
  1142. -    The `l' and `A' options are ignored here since they actually
  1143. -    specify input files.  */
  1144. - void
  1145. - decode_option (swt, arg)
  1146. -      register char *swt, *arg;
  1147. - {
  1148. -   /* We get Bstatic from gcc on suns.  */
  1149. -   if (! strcmp (swt + 1, "Bstatic"))
  1150. -     return;
  1151. -   if (! strcmp (swt + 1, "Ttext"))
  1152. -     {
  1153. -       text_start = parse (arg, "%x", "invalid argument to -Ttext");
  1154. -       T_flag_specified = 1;
  1155. -       return;
  1156. -     }
  1157. -   if (! strcmp (swt + 1, "Tdata"))
  1158. -     {
  1159. -       data_start = parse (arg, "%x", "invalid argument to -Tdata");
  1160. -       Tdata_flag_specified = 1;
  1161. -       return;
  1162. -     }
  1163. -   if (! strcmp (swt + 1, "noinhibit-exec"))
  1164. -     {
  1165. -       force_executable = 1;
  1166. -       return;
  1167. -     }
  1168. -   if (swt[2] != 0)
  1169. -     arg = &swt[2];
  1170. -   switch (swt[1])
  1171. -     {
  1172. -     case 'A':
  1173. -       return;
  1174. -     case 'D':
  1175. -       specified_data_size = parse (arg, "%x", "invalid argument to -D");
  1176. -       return;
  1177. -     case 'd':
  1178. -       force_common_definition = 1;
  1179. -       return;
  1180. -     case 'e':
  1181. -       entry_symbol = getsym (arg);
  1182. -       if (!entry_symbol->defined && !entry_symbol->referenced)
  1183. -     undefined_global_sym_count++;
  1184. -       entry_symbol->referenced = 1;
  1185. -       add_cmdline_ref (entry_symbol);
  1186. -       return;
  1187. -     case 'l':
  1188. -       return;
  1189. -     case 'L':
  1190. -       n_search_dirs++;
  1191. -       search_dirs
  1192. -     = (char **) xrealloc (search_dirs, n_search_dirs * sizeof (char *));
  1193. -       search_dirs[n_search_dirs - 1] = arg;
  1194. -       return;
  1195. -     case 'M':
  1196. -       write_map = 1;
  1197. -       return;
  1198. -     case 'N':
  1199. -       magic = OMAGIC;
  1200. -       return;
  1201. - #ifdef NMAGIC
  1202. -     case 'n':
  1203. -       magic = NMAGIC;
  1204. -       return;
  1205. - #endif
  1206. -     case 'o':
  1207. -       output_filename = arg;
  1208. -       return;
  1209. -     case 'r':
  1210. -       relocatable_output = 1;
  1211. -       magic = OMAGIC;
  1212. -       text_start = 0;
  1213. -       return;
  1214. -     case 'S':
  1215. -       strip_symbols = STRIP_DEBUGGER;
  1216. -       return;
  1217. -     case 's':
  1218. -       strip_symbols = STRIP_ALL;
  1219. -       return;
  1220. -     case 'T':
  1221. -       text_start = parse (arg, "%x", "invalid argument to -T");
  1222. -       T_flag_specified = 1;
  1223. -       return;
  1224. -     case 't':
  1225. -       trace_files = 1;
  1226. -       return;
  1227. -     case 'u':
  1228. -       {
  1229. -     register symbol *sp = getsym (arg);
  1230. -     if (!sp->defined && !sp->referenced)
  1231. -       undefined_global_sym_count++;
  1232. -     sp->referenced = 1;
  1233. -     add_cmdline_ref (sp);
  1234. -       }
  1235. -       return;
  1236. -     case 'V':
  1237. -       {
  1238. -     struct string_list_element *new
  1239. -       = (struct string_list_element *)
  1240. -         xmalloc (sizeof (struct string_list_element));
  1241. -     new->str = arg;
  1242. -     new->next = set_element_prefixes;
  1243. -     set_element_prefixes = new;
  1244. -     return;
  1245. -       }
  1246. -     case 'X':
  1247. -       discard_locals = DISCARD_L;
  1248. -       return;
  1249. -     case 'x':
  1250. -       discard_locals = DISCARD_ALL;
  1251. -       return;
  1252. -     case 'y':
  1253. -       {
  1254. -     register symbol *sp = getsym (&swt[2]);
  1255. -     sp->trace = 1;
  1256. -       }
  1257. -       return;
  1258. -     case 'z':
  1259. -       magic = ZMAGIC;
  1260. -       return;
  1261. -     default:
  1262. -       fatal ("invalid command option `%s'", swt);
  1263. -     }
  1264. - }
  1265.   
  1266. ! /** Convenient functions for operating on one or all files being */
  1267. !  /** loaded.  */
  1268.   void print_file_name ();
  1269.   
  1270.   /* Call FUNCTION on each input file entry.
  1271. --- 1478,1486 ----
  1272.       }
  1273.     return 0;
  1274.   }
  1275.   
  1276. ! /* Convenient functions for operating on one or all files being
  1277. !    loaded.  */
  1278.   void print_file_name ();
  1279.   
  1280.   /* Call FUNCTION on each input file entry.
  1281. ***************
  1282. *** 1494,1502 ****
  1283.   
  1284.     if (input_file) file_close ();
  1285.   
  1286. !   if (entry->search_dirs_flag)
  1287.       {
  1288. -       register char **p = search_dirs;
  1289.         int i;
  1290.   
  1291.         for (i = 0; i < n_search_dirs; i++)
  1292. --- 1596,1603 ----
  1293.   
  1294.     if (input_file) file_close ();
  1295.   
  1296. !   if (entry->search_dirs_flag && n_search_dirs)
  1297.       {
  1298.         int i;
  1299.   
  1300.         for (i = 0; i < n_search_dirs; i++)
  1301. ***************
  1302. *** 1580,1588 ****
  1303.   
  1304.   /* Medium-level input routines for rel files.  */
  1305.   
  1306. ! /* Read a file's header into the proper place in the file_entry.
  1307.      DESC is the descriptor on which the file is open.
  1308. !    ENTRY is the file's entry.  */
  1309.   
  1310.   void
  1311.   read_header (desc, entry)
  1312. --- 1681,1971 ----
  1313.   
  1314.   /* Medium-level input routines for rel files.  */
  1315.   
  1316. ! /* Determine whether the given ENTRY is an archive, a BSD a.out file,
  1317. !    a Mach-O file, or whatever.  DESC is the descriptor on which the
  1318. !    file is open.  */
  1319. ! void
  1320. ! deduce_file_type(desc, entry)
  1321. !      int desc;
  1322. !      struct file_entry *entry;
  1323. ! {
  1324. !   int len;
  1325. !   {
  1326. !     char magic[SARMAG];
  1327. !     
  1328. !     lseek (desc, entry->starting_offset, 0);
  1329. !     len = read (desc, magic, SARMAG);
  1330. !     if (len == SARMAG && !strncmp(magic, ARMAG, SARMAG))
  1331. !       {
  1332. !     entry->file_type = IS_ARCHIVE;
  1333. !     return;
  1334. !       }
  1335. !   }
  1336. ! #ifdef A_OUT
  1337. !   {
  1338. !     struct exec hdr;
  1339. !     lseek (desc, entry->starting_offset, 0);
  1340. ! #ifdef COFF_ENCAPSULATE
  1341. !     if (entry->just_syms_flag)
  1342. !       /* Since a file given with -A will have a coff header, unlike normal
  1343. !     input files, we need to skip over it.  */
  1344. !       lseek (desc, sizeof (coffheader), SEEK_CUR);
  1345. ! #endif
  1346. !     len = read (desc, (char *) &hdr, sizeof (struct exec));
  1347. !     if (len == sizeof (struct exec) && !N_BADMAG (hdr))
  1348. !       {
  1349. !     entry->file_type = IS_A_OUT;
  1350. !     return;
  1351. !       }
  1352. !   }
  1353. ! #endif
  1354. ! #ifdef MACH_O
  1355. !   {
  1356. !     struct mach_header hdr;
  1357. !     lseek (desc, entry->starting_offset, 0);
  1358. !     len = read (desc, (char *) &hdr, sizeof (struct mach_header));
  1359. !     if (len == sizeof (struct mach_header) && hdr.magic == MH_MAGIC)
  1360. !       {
  1361. !     entry->file_type = IS_MACH_O;
  1362. !     return;
  1363. !       }
  1364. !   }
  1365. ! #endif
  1366. !   fatal_with_file ("malformed input file (not rel or archive) ", entry);
  1367. ! }
  1368. ! #ifdef A_OUT
  1369. ! /* Read an a.out file's header and set up the fields of
  1370. !    the ENTRY accordingly.  DESC is the descriptor on which
  1371. !    the file is open.  */
  1372. ! void
  1373. ! read_a_out_header (desc, entry)
  1374. !      int desc;
  1375. !      struct file_entry *entry;
  1376. ! {
  1377. !   register int len;
  1378. !   struct exec hdr;
  1379. !   struct stat st;
  1380. !   lseek (desc, entry->starting_offset, 0);
  1381. ! #ifdef COFF_ENCAPSULATE
  1382. !   if (entry->just_syms_flag)
  1383. !     /* Since a file given with -A will have a coff header, unlike normal
  1384. !        input files, we need to skip over it.  */
  1385. !     lseek (desc, sizeof (coffheader), SEEK_CUR);
  1386. ! #endif
  1387. !   read (desc, (char *) &hdr, sizeof (struct exec));
  1388. ! #ifdef READ_HEADER_HOOK
  1389. !   READ_HEADER_HOOK(hdr.a_machtype);
  1390. ! #endif
  1391. !   if (entry->just_syms_flag)
  1392. !     entry->orig_text_address = N_TXTADDR(hdr);
  1393. !   else
  1394. !     entry->orig_text_address = 0;
  1395. !   entry->text_size = hdr.a_text;
  1396. !   entry->text_offset = N_TXTOFF(hdr);
  1397. !   entry->text_reloc_size = hdr.a_trsize;
  1398. ! #ifdef N_TRELOFF
  1399. !   entry->text_reloc_offset = N_TRELOFF(hdr);
  1400. ! #else
  1401. ! #ifdef N_DATOFF
  1402. !   entry->text_reloc_offset = N_DATOFF(hdr) + hdr.a_data;
  1403. ! #else
  1404. !   entry->text_reloc_offset = N_TXTOFF(hdr) + hdr.a_text + hdr.a_data;
  1405. ! #endif
  1406. ! #endif
  1407. !   if (entry->just_syms_flag)
  1408. !     entry->orig_data_address = N_DATADDR(hdr);
  1409. !   else
  1410. !     entry->orig_data_address = entry->text_size;
  1411. !   entry->data_size = hdr.a_data;
  1412. ! #ifdef N_DATOFF
  1413. !   entry->data_offset = N_DATOFF(hdr);
  1414. ! #else
  1415. !   entry->data_offset = N_TXTOFF(hdr) + hdr.a_text;
  1416. ! #endif
  1417. !   entry->data_reloc_size = hdr.a_drsize;
  1418. ! #ifdef N_DRELOFF
  1419. !   entry->data_reloc_offset = N_DRELOFF(hdr);
  1420. ! #else
  1421. !   entry->data_reloc_offset = entry->text_reloc_offset + entry->text_reloc_size;
  1422. ! #endif
  1423. ! #ifdef N_BSSADDR
  1424. !   if (entry->just_syms_flag)
  1425. !     entry->orig_bss_address = N_BSSADDR(hdr);
  1426. !   else
  1427. ! #endif
  1428. !   entry->orig_bss_address = entry->orig_data_address + entry->data_size;
  1429. !   entry->bss_size = hdr.a_bss;
  1430. !   entry->syms_size = hdr.a_syms;
  1431. !   entry->syms_offset = N_SYMOFF(hdr);
  1432. !   entry->strs_offset = N_STROFF(hdr);
  1433. !   lseek(desc, entry->starting_offset + entry->strs_offset, 0);
  1434. !   if (read(desc, (char *) &entry->strs_size, sizeof (unsigned long int))
  1435. !       != sizeof (unsigned long int))
  1436. !     fatal_with_file ("failure reading string table size of ", entry);
  1437. !   if (!entry->superfile)
  1438. !     {
  1439. !       fstat(desc, &st);
  1440. !       if (st.st_size > entry->strs_offset + entry->strs_size)
  1441. !     {
  1442. !       entry->symseg_size = st.st_size - (entry->strs_offset + entry->strs_size);
  1443. !       entry->symseg_offset = entry->strs_offset + entry->strs_size;
  1444. !     }
  1445. !     }
  1446. !   else
  1447. !     if (entry->total_size > entry->strs_offset + entry->strs_size)
  1448. !       {
  1449. !     entry->symseg_size = entry->total_size - (entry->strs_offset + entry->strs_size);
  1450. !     entry->symseg_offset = entry->strs_offset + entry->strs_size;
  1451. !       }
  1452. ! }
  1453. ! #endif
  1454. ! #ifdef MACH_O
  1455. ! /* Read a Mach-O file's header.  DESC is the descriptor on which the
  1456. !    file is open, and ENTRY is the file's entry.  */
  1457. ! void
  1458. ! read_mach_o_header (desc, entry)
  1459. !      int desc;
  1460. !      struct file_entry *entry;
  1461. ! {
  1462. !   struct mach_header mach_header;
  1463. !   char *hdrbuf;
  1464. !   struct load_command *load_command;
  1465. !   struct segment_command *segment_command;
  1466. !   struct section *section;
  1467. !   struct symtab_command *symtab_command;
  1468. ! #ifdef LC_SYMSEG
  1469. !   struct symseg_command *symseg_command;
  1470. ! #endif;
  1471. !   int ordinal;
  1472. !   int symtab_seen, symseg_seen;
  1473. !   int len, cmd, seg;
  1474. !   entry->text_ordinal = entry->data_ordinal = entry->bss_ordinal = 0;
  1475. !   symtab_seen = symseg_seen = 0;
  1476. !   ordinal = 1;
  1477. !   lseek (desc, entry->starting_offset, 0);
  1478. !   len = read (desc, (char *) &mach_header, sizeof (struct mach_header));
  1479. !   if (len != sizeof (struct mach_header))
  1480. !     fatal_with_file ("failure reading Mach-O header of ", entry);
  1481. !   if (mach_header.filetype != MH_OBJECT && mach_header.filetype != MH_EXECUTE)
  1482. !     fatal_with_file ("unsupported Mach-O file type (not MH_OBJECT or MH_EXECUTE) in ", entry);
  1483. !   hdrbuf = xmalloc (mach_header.sizeofcmds);
  1484. !   len = read (desc, hdrbuf, mach_header.sizeofcmds);
  1485. !   if (len != mach_header.sizeofcmds)
  1486. !     fatal_with_file ("failure reading Mach-O load commands of ", entry);
  1487. !   load_command = (struct load_command *) hdrbuf;
  1488. !   for (cmd = 0; cmd < mach_header.ncmds; ++cmd)
  1489. !     {
  1490. !       switch (load_command->cmd)
  1491. !     {
  1492. !     case LC_SEGMENT:
  1493. !       segment_command = (struct segment_command *) load_command;
  1494. !       section = (struct section *) ((char *) (segment_command + 1));
  1495. !       for (seg = 0; seg < segment_command->nsects; ++seg, ++section, ++ordinal)
  1496. !         {
  1497. !           if (!strncmp(SECT_TEXT, section->sectname, sizeof section->sectname))
  1498. !         if (entry->text_ordinal)
  1499. !           fatal_with_file ("more than one __text section in ", entry);
  1500. !         else
  1501. !           {
  1502. !             entry->text_ordinal = ordinal;
  1503. !             entry->orig_text_address = section->addr;
  1504. !             entry->text_size = section->size;
  1505. !             entry->text_offset = section->offset;
  1506. !             entry->text_reloc_size = section->nreloc * sizeof (struct relocation_info);
  1507. !             entry->text_reloc_offset = section->reloff;
  1508. !           }
  1509. !           else if (!strncmp(SECT_DATA, section->sectname, sizeof section->sectname))
  1510. !         if (entry->data_ordinal)
  1511. !           fatal_with_file ("more than one __data section in ", entry);
  1512. !         else
  1513. !           {
  1514. !             entry->data_ordinal = ordinal;
  1515. !             entry->orig_data_address = section->addr;
  1516. !             entry->data_size = section->size;
  1517. !             entry->data_offset = section->offset;
  1518. !             entry->data_reloc_size = section->nreloc * sizeof (struct relocation_info);
  1519. !             entry->data_reloc_offset = section->reloff;
  1520. !           }
  1521. !           else if (!strncmp(SECT_BSS, section->sectname, sizeof section->sectname))
  1522. !         if (entry->bss_ordinal)
  1523. !           fatal_with_file ("more than one __bss section in ", entry);
  1524. !         else
  1525. !           {
  1526. !             entry->bss_ordinal = ordinal;
  1527. !             entry->orig_bss_address = section->addr;
  1528. !             entry->bss_size = section->size;
  1529. !           }
  1530. !           else
  1531. !         if (section->size != 0)
  1532. !           fprintf (stderr, "%s: warning: unknown section `%.*s' in %s\n",
  1533. !                progname, sizeof section->sectname, section->sectname,
  1534. !                entry->filename);
  1535. !         }
  1536. !       break;
  1537. !     case LC_SYMTAB:
  1538. !       if (symtab_seen)
  1539. !           fatal_with_file ("more than one LC_SYMTAB in ", entry);
  1540. !       else
  1541. !         {
  1542. !           symtab_seen = 1;
  1543. !           symtab_command = (struct symtab_command *) load_command;
  1544. !           entry->syms_size = symtab_command->nsyms * sizeof (struct nlist);
  1545. !           entry->syms_offset = symtab_command->symoff;
  1546. !           entry->strs_size = symtab_command->strsize;
  1547. !           entry->strs_offset = symtab_command->stroff;
  1548. !         }
  1549. !       break;
  1550. ! #ifdef LC_SYMSEG
  1551. !     case LC_SYMSEG:
  1552. !       if (symseg_seen)
  1553. !         fatal_with_file ("more than one LC_SYMSEG in ", entry);
  1554. !       else
  1555. !         {
  1556. !           symseg_seen = 1;
  1557. !           symseg_command = (struct symseg_command *) load_command;
  1558. !           entry->symseg_size = symseg_command->size;
  1559. !           entry->symseg_offset = symseg_command->offset;
  1560. !         }
  1561. !       break;
  1562. ! #endif
  1563. !     }
  1564. !       load_command = (struct load_command *)
  1565. !     ((char *) load_command + load_command->cmdsize);
  1566. !     }
  1567. !   free (hdrbuf);
  1568. !   if (!symtab_seen)
  1569. !     fprintf (stderr, "%s: no symbol table in %s\n", progname, entry->filename);
  1570. ! }
  1571. ! #endif
  1572. ! /* Read a file's header info into the proper place in the file_entry.
  1573.      DESC is the descriptor on which the file is open.
  1574. !    ENTRY is the file's entry.
  1575. !    Switch in the file_type to determine the appropriate actual
  1576. !    header reading routine to call.  */
  1577.   
  1578.   void
  1579.   read_header (desc, entry)
  1580. ***************
  1581. *** 1589,1611 ****
  1582.        int desc;
  1583.        register struct file_entry *entry;
  1584.   {
  1585. !   register int len;
  1586. !   struct exec *loc = (struct exec *) &entry->header;
  1587.   
  1588. !   lseek (desc, entry->starting_offset, 0);
  1589. !   len = read (desc, loc, sizeof (struct exec));
  1590. !   if (len != sizeof (struct exec))
  1591. !     fatal_with_file ("failure reading header of ", entry);
  1592. !   if (N_BADMAG (*loc))
  1593. !     fatal_with_file ("bad magic number in ", entry);
  1594.   
  1595.     entry->header_read_flag = 1;
  1596.   }
  1597.   
  1598.   /* Read the symbols of file ENTRY into core.
  1599. !    Assume it is already open, on descriptor DESC.
  1600. !    Also read the length of the string table, which follows the symbol table,
  1601. !    but don't read the contents of the string table.  */
  1602.   
  1603.   void
  1604.   read_entry_symbols (desc, entry)
  1605. --- 1972,2009 ----
  1606.        int desc;
  1607.        register struct file_entry *entry;
  1608.   {
  1609. !   if (!entry->file_type)
  1610. !     deduce_file_type (desc, entry);
  1611.   
  1612. !   switch (entry->file_type)
  1613. !     {
  1614. !     case IS_ARCHIVE:
  1615. !     default:
  1616. !       /* Should never happen. */
  1617. !       abort ();
  1618. ! #ifdef A_OUT
  1619. !     case IS_A_OUT:
  1620. !       read_a_out_header (desc, entry);
  1621. !       break;
  1622. ! #endif
  1623. ! #ifdef MACH_O
  1624. !     case IS_MACH_O:
  1625. !       read_mach_o_header (desc, entry);
  1626. !       break;
  1627. ! #endif
  1628. !     }
  1629.   
  1630.     entry->header_read_flag = 1;
  1631.   }
  1632.   
  1633. + #ifdef MACH_O
  1634. + void translate_mach_o_symbols ();
  1635. + #endif
  1636.   /* Read the symbols of file ENTRY into core.
  1637. !    Assume it is already open, on descriptor DESC.  */
  1638.   
  1639.   void
  1640.   read_entry_symbols (desc, entry)
  1641. ***************
  1642. *** 1617,1638 ****
  1643.     if (!entry->header_read_flag)
  1644.       read_header (desc, entry);
  1645.   
  1646. !   entry->symbols = (struct nlist *) xmalloc (entry->header.a_syms);
  1647.   
  1648. !   lseek (desc, N_SYMOFF (entry->header) + entry->starting_offset, 0);
  1649. !   if (entry->header.a_syms != read (desc, entry->symbols, entry->header.a_syms))
  1650.       fatal_with_file ("premature end of file in symbols of ", entry);
  1651.   
  1652. !   lseek (desc, N_STROFF (entry->header) + entry->starting_offset, 0);
  1653. !   if (sizeof str_size != read (desc, &str_size, sizeof str_size))
  1654. !     fatal_with_file ("bad string table size in ", entry);
  1655. !   entry->string_size = str_size;
  1656.   }
  1657.   
  1658.   /* Read the string table of file ENTRY into core.
  1659. !    Assume it is already open, on descriptor DESC.
  1660. !    Also record whether a GDB symbol segment follows the string table.  */
  1661.   
  1662.   void
  1663.   read_entry_strings (desc, entry)
  1664. --- 2015,2034 ----
  1665.     if (!entry->header_read_flag)
  1666.       read_header (desc, entry);
  1667.   
  1668. !   entry->symbols = (struct nlist *) xmalloc (entry->syms_size);
  1669.   
  1670. !   lseek (desc, entry->syms_offset + entry->starting_offset, 0);
  1671. !   if (entry->syms_size != read (desc, entry->symbols, entry->syms_size))
  1672.       fatal_with_file ("premature end of file in symbols of ", entry);
  1673.   
  1674. ! #ifdef MACH_O
  1675. !   if (entry->file_type == IS_MACH_O)
  1676. !     translate_mach_o_symbols (entry);
  1677. ! #endif
  1678.   }
  1679.   
  1680.   /* Read the string table of file ENTRY into core.
  1681. !    Assume it is already open, on descriptor DESC.  */
  1682.   
  1683.   void
  1684.   read_entry_strings (desc, entry)
  1685. ***************
  1686. *** 1644,1671 ****
  1687.     if (!entry->header_read_flag)
  1688.       read_header (desc, entry);
  1689.   
  1690. !   lseek (desc, N_STROFF (entry->header) + entry->starting_offset, 0);
  1691. !   if (entry->string_size != read (desc, entry->strings, entry->string_size))
  1692.       fatal_with_file ("premature end of file in strings of ", entry);
  1693. -   /* While we are here, see if the file has a symbol segment at the end.
  1694. -      For a separate file, just try reading some more.
  1695. -      For a library member, compare current pos against total size.  */
  1696. -   if (entry->superfile)
  1697. -     {
  1698. -       if (entry->total_size == N_STROFF (entry->header) + entry->string_size)
  1699. -     return;
  1700. -     }
  1701. -   else
  1702. -     {
  1703. -       buffer = read (desc, &buffer, sizeof buffer);
  1704. -       if (buffer == 0)
  1705. -     return;
  1706. -       if (buffer != sizeof buffer)
  1707. -     fatal_with_file ("premature end of file in GDB symbol segment of ", entry);
  1708. -     }
  1709. -   entry->symseg_offset = N_STROFF (entry->header) + entry->string_size;
  1710.   }
  1711.   
  1712.   /* Read in the symbols of all input files.  */
  1713. --- 2040,2048 ----
  1714.     if (!entry->header_read_flag)
  1715.       read_header (desc, entry);
  1716.   
  1717. !   lseek (desc, entry->strs_offset + entry->starting_offset, 0);
  1718. !   if (entry->strs_size != read (desc, entry->strings, entry->strs_size))
  1719.       fatal_with_file ("premature end of file in strings of ", entry);
  1720.   }
  1721.   
  1722.   /* Read in the symbols of all input files.  */
  1723. ***************
  1724. *** 1698,1730 ****
  1725.        register struct file_entry *entry;
  1726.   {
  1727.     register int desc;
  1728. -   register int len;
  1729. -   struct exec hdr;
  1730.   
  1731.     desc = file_open (entry);
  1732.   
  1733. !   len = read (desc, &hdr, sizeof hdr);
  1734. !   if (len != sizeof hdr)
  1735. !     fatal_with_file ("failure reading header of ", entry);
  1736.   
  1737. !   if (!N_BADMAG (hdr))
  1738.       {
  1739.         read_entry_symbols (desc, entry);
  1740. !       entry->strings = (char *) alloca (entry->string_size);
  1741.         read_entry_strings (desc, entry);
  1742.         enter_file_symbols (entry);
  1743.         entry->strings = 0;
  1744.       }
  1745. -   else
  1746. -     {
  1747. -       char armag[SARMAG];
  1748. -       lseek (desc, 0, 0);
  1749. -       if (SARMAG != read (desc, armag, SARMAG) || strncmp (armag, ARMAG, SARMAG))
  1750. -     fatal_with_file ("malformed input file (not rel or archive) ", entry);
  1751. -       entry->library_flag = 1;
  1752. -       search_library (desc, entry);
  1753. -     }
  1754.   
  1755.     file_close ();
  1756.   }
  1757. --- 2075,2099 ----
  1758.        register struct file_entry *entry;
  1759.   {
  1760.     register int desc;
  1761.   
  1762.     desc = file_open (entry);
  1763.   
  1764. !   if (!entry->file_type)
  1765. !     deduce_file_type (desc, entry);
  1766.   
  1767. !   if (entry->file_type == IS_ARCHIVE)
  1768. !     {
  1769. !       entry->library_flag = 1;
  1770. !       search_library (desc, entry);
  1771. !     }
  1772. !   else
  1773.       {
  1774.         read_entry_symbols (desc, entry);
  1775. !       entry->strings = (char *) alloca (entry->strs_size);
  1776.         read_entry_strings (desc, entry);
  1777.         enter_file_symbols (entry);
  1778.         entry->strings = 0;
  1779.       }
  1780.   
  1781.     file_close ();
  1782.   }
  1783. ***************
  1784. *** 1737,1744 ****
  1785.   {
  1786.     register struct nlist
  1787.       *p,
  1788. !     *end = entry->symbols + entry->header.a_syms / sizeof (struct nlist);
  1789. !   int lowest_set_vector = -1;
  1790.   
  1791.     if (trace_files) prline_file_name (entry, stderr);
  1792.   
  1793. --- 2106,2112 ----
  1794.   {
  1795.     register struct nlist
  1796.       *p,
  1797. !     *end = entry->symbols + entry->syms_size / sizeof (struct nlist);
  1798.   
  1799.     if (trace_files) prline_file_name (entry, stderr);
  1800.   
  1801. ***************
  1802. *** 1752,1758 ****
  1803.         if (SET_ELEMENT_P (p->n_type))
  1804.       {
  1805.         set_symbol_count++;
  1806. !       if (!relocatable_output)
  1807.           enter_global_ref (p, p->n_un.n_strx + entry->strings, entry);
  1808.       }
  1809.         else if (p->n_type == N_WARNING)
  1810. --- 2120,2126 ----
  1811.         if (SET_ELEMENT_P (p->n_type))
  1812.       {
  1813.         set_symbol_count++;
  1814. !       if (output_style != OUTPUT_RELOCATABLE)
  1815.           enter_global_ref (p, p->n_un.n_strx + entry->strings, entry);
  1816.       }
  1817.         else if (p->n_type == N_WARNING)
  1818. ***************
  1819. *** 1862,1869 ****
  1820. --- 2230,2242 ----
  1821.         /* Indirect symbols value should be modified to point
  1822.            a symbol being equivalenced to. */
  1823.         nlist_p->n_value
  1824. + #ifndef NeXT
  1825.           = (unsigned int) getsym ((nlist_p + 1)->n_un.n_strx
  1826.                        + entry->strings);
  1827. + #else
  1828. +         /* NeXT also has indirection but they do it weirdly. */
  1829. +         = (unsigned int) getsym (nlist_p->n_value + entry->strings);
  1830. + #endif
  1831.         if ((symbol *) nlist_p->n_value == sp)
  1832.           {
  1833.             /* Somebody redefined a symbol to be itself.  */
  1834. ***************
  1835. *** 1909,1915 ****
  1836.     if (sp->trace)
  1837.       {
  1838.         register char *reftype;
  1839. !       switch (type & N_TYPE)
  1840.       {
  1841.       case N_UNDF:
  1842.         if (nlist_p->n_value)
  1843. --- 2282,2288 ----
  1844.     if (sp->trace)
  1845.       {
  1846.         register char *reftype;
  1847. !       switch (type & ~N_EXT)
  1848.       {
  1849.       case N_UNDF:
  1850.         if (nlist_p->n_value)
  1851. ***************
  1852. *** 1954,1964 ****
  1853.         break;
  1854.   
  1855.       case N_INDR:
  1856. !       reftype = (char *) alloca (23
  1857. !                      + strlen ((nlist_p + 1)->n_un.n_strx
  1858. !                            + entry->strings));
  1859.         sprintf (reftype, "defined equivalent to %s",
  1860. !            (nlist_p + 1)->n_un.n_strx + entry->strings);
  1861.         break;
  1862.   
  1863.   #ifdef sequent
  1864. --- 2327,2335 ----
  1865.         break;
  1866.   
  1867.       case N_INDR:
  1868. !       reftype = (char *) alloca (23 + strlen (((symbol *) nlist_p->n_value)->name));
  1869.         sprintf (reftype, "defined equivalent to %s",
  1870. !            ((symbol *) nlist_p->n_value)->name);
  1871.         break;
  1872.   
  1873.   #ifdef sequent
  1874. ***************
  1875. *** 1975,1984 ****
  1876.         reftype = "shared BSS";
  1877.         break;
  1878.   */
  1879.       default:
  1880.         reftype = "I don't know this type";
  1881.         break;
  1882. - #endif
  1883.       }
  1884.   
  1885.         fprintf (stderr, "symbol %s %s in ", sp->name, reftype);
  1886. --- 2346,2356 ----
  1887.         reftype = "shared BSS";
  1888.         break;
  1889.   */
  1890. + #endif
  1891.       default:
  1892.         reftype = "I don't know this type";
  1893.         break;
  1894.       }
  1895.   
  1896.         fprintf (stderr, "symbol %s %s in ", sp->name, reftype);
  1897. ***************
  1898. *** 1998,2004 ****
  1899.   {
  1900.     if (n_ptr >= entry->symbols &&
  1901.         n_ptr < (entry->symbols
  1902. !            + (entry->header.a_syms / sizeof (struct nlist))))
  1903.       return (unsigned long) entry;
  1904.     return 0;
  1905.   }
  1906. --- 2370,2376 ----
  1907.   {
  1908.     if (n_ptr >= entry->symbols &&
  1909.         n_ptr < (entry->symbols
  1910. !            + (entry->syms_size / sizeof (struct nlist))))
  1911.       return (unsigned long) entry;
  1912.     return 0;
  1913.   }
  1914. ***************
  1915. *** 2205,2211 ****
  1916.                + symdef_base[i].symbol_name_string_index,
  1917.                entry->filename);
  1918.           read_entry_symbols (desc, subentry);
  1919. !         subentry->strings = (char *) malloc (subentry->string_size);
  1920.           read_entry_strings (desc, subentry);
  1921.   
  1922.           /* Now scan the symbol table and decide whether to load.  */
  1923. --- 2577,2583 ----
  1924.                + symdef_base[i].symbol_name_string_index,
  1925.                entry->filename);
  1926.           read_entry_symbols (desc, subentry);
  1927. !         subentry->strings = xmalloc (subentry->strs_size);
  1928.           read_entry_strings (desc, subentry);
  1929.   
  1930.           /* Now scan the symbol table and decide whether to load.  */
  1931. ***************
  1932. *** 2213,2218 ****
  1933. --- 2585,2591 ----
  1934.           if (!subfile_wanted_p (subentry))
  1935.             {
  1936.               free (subentry->symbols);
  1937. +             free (subentry->strings);
  1938.               free (subentry);
  1939.             }
  1940.           else
  1941. ***************
  1942. *** 2238,2244 ****
  1943.               if (symdef_base[j].library_member_offset == offset)
  1944.                 symdef_base[j].symbol_name_string_index = -1;
  1945.                 }
  1946. -           }
  1947.   
  1948.           /* We'll read the strings again if we need them again.  */
  1949.           free (subentry->strings);
  1950. --- 2611,2616 ----
  1951. ***************
  1952. *** 2246,2251 ****
  1953. --- 2618,2624 ----
  1954.             }
  1955.             }
  1956.         }
  1957. +     }
  1958.   
  1959.     free (symdef_data);
  1960.   }
  1961. ***************
  1962. *** 2258,2267 ****
  1963.        register struct file_entry *subentry;
  1964.        struct file_entry **prev_addr, *entry;
  1965.   {
  1966. -   register struct file_entry *prev = *prev_addr;
  1967.     read_entry_symbols (desc, subentry);
  1968. !   subentry->strings = (char *) alloca (subentry->string_size);
  1969.     read_entry_strings (desc, subentry);
  1970.   
  1971.     if (!subfile_wanted_p (subentry))
  1972. --- 2631,2638 ----
  1973.        register struct file_entry *subentry;
  1974.        struct file_entry **prev_addr, *entry;
  1975.   {
  1976.     read_entry_symbols (desc, subentry);
  1977. !   subentry->strings = (char *) alloca (subentry->strs_size);
  1978.     read_entry_strings (desc, subentry);
  1979.   
  1980.     if (!subfile_wanted_p (subentry))
  1981. ***************
  1982. *** 2273,2283 ****
  1983.       {
  1984.         enter_file_symbols (subentry);
  1985.   
  1986. !       if (prev)
  1987. !     prev->chain = subentry;
  1988.         else
  1989.       entry->subfiles = subentry;
  1990. !       prev = subentry;
  1991.         subentry->strings = 0; /* Since space will dissapear on return */
  1992.       }
  1993.   }
  1994. --- 2644,2654 ----
  1995.       {
  1996.         enter_file_symbols (subentry);
  1997.   
  1998. !       if (*prev_addr)
  1999. !     (*prev_addr)->chain = subentry;
  2000.         else
  2001.       entry->subfiles = subentry;
  2002. !       *prev_addr = subentry;
  2003.         subentry->strings = 0; /* Since space will dissapear on return */
  2004.       }
  2005.   }
  2006. ***************
  2007. *** 2319,2325 ****
  2008.   {
  2009.     register struct nlist *p;
  2010.     register struct nlist *end
  2011. !     = entry->symbols + entry->header.a_syms / sizeof (struct nlist);
  2012.   #ifdef DOLLAR_KLUDGE
  2013.     register int dollar_cond = 0;
  2014.   #endif
  2015. --- 2690,2696 ----
  2016.   {
  2017.     register struct nlist *p;
  2018.     register struct nlist *end
  2019. !     = entry->symbols + entry->syms_size / sizeof (struct nlist);
  2020.   #ifdef DOLLAR_KLUDGE
  2021.     register int dollar_cond = 0;
  2022.   #endif
  2023. ***************
  2024. *** 2367,2372 ****
  2025. --- 2738,2745 ----
  2026.         if (!sp) continue;
  2027.   
  2028.         if ((sp->referenced && !sp->defined)
  2029. +           /* NB.  This needs to be changed so that, e.g., "int pipe;" won't import
  2030. +          pipe() from the library.  But the bug fix kingdon made was wrong.  */
  2031.             || (sp->defined && sp->max_common_size))
  2032.           {
  2033.             /* This is a symbol we are looking for.  It is either
  2034. ***************
  2035. *** 2423,2428 ****
  2036. --- 2796,2807 ----
  2037.     if (trace_files)
  2038.       fprintf (stderr, "Digesting symbol information:\n\n");
  2039.   
  2040. +   /* Initialize the text_start address; this depends on the output file formats.  */
  2041. +   initialize_text_start ();
  2042. +   text_size = text_header_size;
  2043.     /* Compute total size of sections */
  2044.   
  2045.     each_file (consider_file_section_lengths, 0);
  2046. ***************
  2047. *** 2430,2463 ****
  2048.     /* If necessary, pad text section to full page in the file.
  2049.        Include the padding in the text segment size.  */
  2050.   
  2051. ! #ifdef NMAGIC
  2052. !   if (magic == ZMAGIC || magic == NMAGIC)
  2053. ! #else
  2054. !   if (magic == ZMAGIC)
  2055. ! #endif
  2056.       {
  2057. !       int text_end = text_size + N_TXTOFF (outheader);
  2058. !       text_pad = ((text_end + page_size - 1) & (- page_size)) - text_end;
  2059.         text_size += text_pad;
  2060.       }
  2061.   
  2062. !   outheader.a_text = text_size;
  2063. ! #ifdef sequent
  2064. !   outheader.a_text += N_ADDRADJ (outheader);
  2065. ! #endif
  2066. !   /* Make the data segment address start in memory on a suitable boundary.  */
  2067.   
  2068. !   if (! Tdata_flag_specified)
  2069. !     data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
  2070.   
  2071.     /* Make sure bss starts out aligned as much as anyone can want.  */
  2072.   
  2073. !   data_size = (data_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  2074.   
  2075.     /* Set up the set element vector */
  2076.   
  2077. !   if (!relocatable_output)
  2078.       {
  2079.         /* The set sector size is the number of set elements + a word
  2080.            for each symbol for the length word at the beginning of the
  2081. --- 2809,2836 ----
  2082.     /* If necessary, pad text section to full page in the file.
  2083.        Include the padding in the text segment size.  */
  2084.   
  2085. !   if (output_style == OUTPUT_READONLY_TEXT || output_style == OUTPUT_DEMAND_PAGED)
  2086.       {
  2087. !       text_pad = ((text_size + page_size - 1) & (- page_size)) - text_size;
  2088.         text_size += text_pad;
  2089.       }
  2090.   
  2091. !   /* Now that the text_size is known, initialize the data start address;
  2092. !      this depends on text_size as well as the output file format.  */
  2093.   
  2094. !   initialize_data_start ();
  2095.   
  2096.     /* Make sure bss starts out aligned as much as anyone can want.  */
  2097. +   {
  2098. +     int new_data_size = (data_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  2099.   
  2100. !     data_pad += new_data_size - data_size;
  2101. !     data_size = new_data_size;
  2102. !   }
  2103.   
  2104.     /* Set up the set element vector */
  2105.   
  2106. !   if (output_style != OUTPUT_RELOCATABLE)
  2107.       {
  2108.         /* The set sector size is the number of set elements + a word
  2109.            for each symbol for the length word at the beginning of the
  2110. ***************
  2111. *** 2493,2499 ****
  2112.       {
  2113.         /* For each symbol */
  2114.         register struct nlist *p, *next;
  2115. !       int defs = 0, com = sp->max_common_size, erred = 0;
  2116.         struct nlist *first_definition;
  2117.         for (p = sp->refs; p; p = next)
  2118.           {
  2119. --- 2866,2872 ----
  2120.       {
  2121.         /* For each symbol */
  2122.         register struct nlist *p, *next;
  2123. !       int defs = 0, com = sp->max_common_size;
  2124.         struct nlist *first_definition;
  2125.         for (p = sp->refs; p; p = next)
  2126.           {
  2127. ***************
  2128. *** 2501,2507 ****
  2129.   
  2130.             if (SET_ELEMENT_P (type))
  2131.           {
  2132. !           if (relocatable_output)
  2133.               fatal ("internal: global ref to set element with -r");
  2134.             if (!defs++)
  2135.               {
  2136. --- 2874,2880 ----
  2137.   
  2138.             if (SET_ELEMENT_P (type))
  2139.           {
  2140. !           if (output_style == OUTPUT_RELOCATABLE)
  2141.               fatal ("internal: global ref to set element with -r");
  2142.             if (!defs++)
  2143.               {
  2144. ***************
  2145. *** 2535,2541 ****
  2146.         /* Allocate as common if defined as common and not defined for real */
  2147.         if (com && !defs)
  2148.           {
  2149. !           if (!relocatable_output || force_common_definition)
  2150.           {
  2151.             int align = sizeof (int);
  2152.   
  2153. --- 2908,2914 ----
  2154.         /* Allocate as common if defined as common and not defined for real */
  2155.         if (com && !defs)
  2156.           {
  2157. !           if (output_style != OUTPUT_RELOCATABLE || force_common_definition)
  2158.           {
  2159.             int align = sizeof (int);
  2160.   
  2161. ***************
  2162. *** 2604,2629 ****
  2163.   
  2164.     bss_size = (bss_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  2165.   
  2166. !   if (end_symbol)        /* These are null if -r.  */
  2167.       {
  2168. !       etext_symbol->value = text_size + text_start;
  2169. !       edata_symbol->value = data_start + data_size;
  2170. !       end_symbol->value = data_start + data_size + bss_size;
  2171.       }
  2172.   
  2173.     /* Figure the data_pad now, so that it overlaps with the bss addresses.  */
  2174.   
  2175.     if (specified_data_size && specified_data_size > data_size)
  2176. !     data_pad = specified_data_size - data_size;
  2177.   
  2178. !   if (magic == ZMAGIC)
  2179. !     data_pad = ((data_pad + data_size + page_size - 1) & (- page_size))
  2180. !                - data_size;
  2181.   
  2182. !   bss_size -= data_pad;
  2183.     if (bss_size < 0) bss_size = 0;
  2184.   
  2185. !   data_size += data_pad;
  2186.   }
  2187.   
  2188.   /* Accumulate the section sizes of input file ENTRY
  2189. --- 2977,3029 ----
  2190.   
  2191.     bss_size = (bss_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  2192.   
  2193. !   /* Give values to _end and friends.  */
  2194.     {
  2195. !     int end_value = data_start + data_size + bss_size;
  2196. !     if (end_symbol)
  2197. !       end_symbol->value = end_value;
  2198. !     if (end_symbol_alt)
  2199. !       end_symbol_alt->value = end_value;
  2200. !   }
  2201. !   {
  2202. !     int etext_value = text_size + text_start;
  2203. !     if (etext_symbol)
  2204. !       etext_symbol->value = etext_value;
  2205. !     if (etext_symbol_alt)
  2206. !       etext_symbol_alt->value = etext_value;
  2207. !   }
  2208. !   {
  2209. !     int edata_value = data_start + data_size;
  2210. !     if (edata_symbol)
  2211. !       edata_symbol->value = edata_value;
  2212. !     if (edata_symbol_alt)
  2213. !       edata_symbol_alt->value = edata_value;
  2214.     }
  2215.   
  2216.     /* Figure the data_pad now, so that it overlaps with the bss addresses.  */
  2217.   
  2218. +   {
  2219. +     /* The amount of data_pad that we are computing now.  This is the
  2220. +        part which overlaps with bss.  What was computed previously
  2221. +        goes before bss.  */
  2222. +     int data_pad_additional = 0;
  2223. +     
  2224.       if (specified_data_size && specified_data_size > data_size)
  2225. !       data_pad_additional = specified_data_size - data_size;
  2226.   
  2227. !     if (output_style == OUTPUT_DEMAND_PAGED)
  2228. !       data_pad_additional =
  2229. !     ((data_pad_additional + data_size + page_size - 1) & (- page_size)) - data_size;
  2230.   
  2231. !     bss_size -= data_pad_additional;
  2232.       if (bss_size < 0) bss_size = 0;
  2233.   
  2234. !     data_size += data_pad_additional;
  2235. !     data_pad += data_pad_additional;
  2236. !   }
  2237.   }
  2238.   
  2239.   /* Accumulate the section sizes of input file ENTRY
  2240. ***************
  2241. *** 2638,2651 ****
  2242.   
  2243.     entry->text_start_address = text_size;
  2244.     /* If there were any vectors, we need to chop them off */
  2245. !   text_size += entry->header.a_text;
  2246.     entry->data_start_address = data_size;
  2247. !   data_size += entry->header.a_data;
  2248.     entry->bss_start_address = bss_size;
  2249. !   bss_size += entry->header.a_bss;
  2250.   
  2251. !   text_reloc_size += entry->header.a_trsize;
  2252. !   data_reloc_size += entry->header.a_drsize;
  2253.   }
  2254.   
  2255.   /* Determine where the sections of ENTRY go into the output file,
  2256. --- 3038,3051 ----
  2257.   
  2258.     entry->text_start_address = text_size;
  2259.     /* If there were any vectors, we need to chop them off */
  2260. !   text_size += entry->text_size;
  2261.     entry->data_start_address = data_size;
  2262. !   data_size += entry->data_size;
  2263.     entry->bss_start_address = bss_size;
  2264. !   bss_size += entry->bss_size;
  2265.   
  2266. !   text_reloc_size += entry->text_reloc_size;
  2267. !   data_reloc_size += entry->data_reloc_size;
  2268.   }
  2269.   
  2270.   /* Determine where the sections of ENTRY go into the output file,
  2271. ***************
  2272. *** 2657,2665 ****
  2273.        register struct file_entry *entry;
  2274.   {
  2275.     entry->text_start_address += text_start;
  2276. !   /* Note that `data_start' and `data_size' have not yet been
  2277. !      adjusted for `data_pad'.  If they had been, we would get the wrong
  2278. !      results here.  */
  2279.     entry->data_start_address += data_start;
  2280.     entry->bss_start_address += data_start + data_size;
  2281.   
  2282. --- 3057,3066 ----
  2283.        register struct file_entry *entry;
  2284.   {
  2285.     entry->text_start_address += text_start;
  2286. !   /* Note that `data_start' and `data_size' have not yet been adjusted
  2287. !      for the portion of data_pad which overlaps with bss.  If they had
  2288. !      been, we would get the wrong results here.  */
  2289.     entry->data_start_address += data_start;
  2290.     entry->bss_start_address += data_start + data_size;
  2291.   
  2292. ***************
  2293. *** 2666,2697 ****
  2294.     {
  2295.       register struct nlist *p;
  2296.       register struct nlist *end
  2297. !       = entry->symbols + entry->header.a_syms / sizeof (struct nlist);
  2298.   
  2299.       for (p = entry->symbols; p < end; p++)
  2300.         {
  2301.       /* If this belongs to a section, update it by the section's start address */
  2302. !     register int type = p->n_type & N_TYPE;
  2303.   
  2304.       switch (type)
  2305.         {
  2306.         case N_TEXT:
  2307.         case N_SETT:
  2308. !         p->n_value += entry->text_start_address;
  2309.           break;
  2310.         case N_DATA:
  2311.         case N_SETV:
  2312.         case N_SETD:
  2313. !         /* A symbol whose value is in the data section
  2314. !            is present in the input file as if the data section
  2315. !            started at an address equal to the length of the file's text.  */
  2316. !         p->n_value += entry->data_start_address - entry->header.a_text;
  2317.           break;
  2318.         case N_BSS:
  2319.         case N_SETB:
  2320.           /* likewise for symbols with value in BSS.  */
  2321. !         p->n_value += entry->bss_start_address
  2322. !           - entry->header.a_text - entry->header.a_data;
  2323.           break;
  2324.         }
  2325.         }
  2326. --- 3067,3098 ----
  2327.     {
  2328.       register struct nlist *p;
  2329.       register struct nlist *end
  2330. !       = entry->symbols + entry->syms_size / sizeof (struct nlist);
  2331.   
  2332.       for (p = entry->symbols; p < end; p++)
  2333.         {
  2334.       /* If this belongs to a section, update it by the section's start address */
  2335. !     register int type = p->n_type & ~N_EXT;
  2336.   
  2337.       switch (type)
  2338.         {
  2339.         case N_TEXT:
  2340.         case N_SETT:
  2341. !         p->n_value += entry->text_start_address - entry->orig_text_address;
  2342.           break;
  2343.         case N_DATA:
  2344.         case N_SETV:
  2345.         case N_SETD:
  2346. !         /* Data segment symbol.  Subtract the address of the
  2347. !            data segment in the input file, and add the address
  2348. !            of this input file's data segment in the output file.  */
  2349. !         p->n_value +=
  2350. !           entry->data_start_address - entry->orig_data_address;
  2351.           break;
  2352.         case N_BSS:
  2353.         case N_SETB:
  2354.           /* likewise for symbols with value in BSS.  */
  2355. !         p->n_value += entry->bss_start_address - entry->orig_bss_address;
  2356.           break;
  2357.         }
  2358.         }
  2359. ***************
  2360. *** 2742,2750 ****
  2361.       fprintf (outfile, " symbols only\n", 0);
  2362.     else
  2363.       fprintf (outfile, " text %x(%x), data %x(%x), bss %x(%x) hex\n",
  2364. !          entry->text_start_address, entry->header.a_text,
  2365. !          entry->data_start_address, entry->header.a_data,
  2366. !          entry->bss_start_address, entry->header.a_bss);
  2367.   }
  2368.   
  2369.   void
  2370. --- 3143,3151 ----
  2371.       fprintf (outfile, " symbols only\n", 0);
  2372.     else
  2373.       fprintf (outfile, " text %x(%x), data %x(%x), bss %x(%x) hex\n",
  2374. !          entry->text_start_address, entry->text_size,
  2375. !          entry->data_start_address, entry->data_size,
  2376. !          entry->bss_start_address, entry->bss_size);
  2377.   }
  2378.   
  2379.   void
  2380. ***************
  2381. *** 2754,2762 ****
  2382.   {
  2383.     register struct nlist
  2384.       *p,
  2385. !     *end = entry->symbols + entry->header.a_syms / sizeof (struct nlist);
  2386.   
  2387. !   entry->strings = (char *) alloca (entry->string_size);
  2388.     read_entry_strings (file_open (entry), entry);
  2389.   
  2390.     fprintf (outfile, "\nLocal symbols of ");
  2391. --- 3155,3163 ----
  2392.   {
  2393.     register struct nlist
  2394.       *p,
  2395. !     *end = entry->symbols + entry->syms_size / sizeof (struct nlist);
  2396.   
  2397. !   entry->strings = (char *) alloca (entry->strs_size);
  2398.     read_entry_strings (file_open (entry), entry);
  2399.   
  2400.     fprintf (outfile, "\nLocal symbols of ");
  2401. ***************
  2402. *** 2831,2837 ****
  2403.     current->filename = next->filename;
  2404.   
  2405.     while (++(next->sym) < (entry->symbols
  2406. !               + entry->header.a_syms/sizeof (struct nlist)))
  2407.       {
  2408.         /* n_type is a char, and N_SOL, N_EINCL and N_BINCL are > 0x80, so
  2409.          * may look negative...therefore, must mask to low bits
  2410. --- 3232,3238 ----
  2411.     current->filename = next->filename;
  2412.   
  2413.     while (++(next->sym) < (entry->symbols
  2414. !               + entry->syms_size/sizeof (struct nlist)))
  2415.       {
  2416.         /* n_type is a char, and N_SOL, N_EINCL and N_BINCL are > 0x80, so
  2417.          * may look negative...therefore, must mask to low bits
  2418. ***************
  2419. *** 2891,2903 ****
  2420.   
  2421.     for (tmp = entry->symbols;
  2422.          tmp < (entry->symbols
  2423. !           + entry->header.a_syms/sizeof (struct nlist));
  2424.          tmp++)
  2425.       if (tmp->n_type == (int) N_SO)
  2426.         break;
  2427.   
  2428.     if (tmp >= (entry->symbols
  2429. !           + entry->header.a_syms/sizeof (struct nlist)))
  2430.       {
  2431.         /* I believe this translates to "We lose" */
  2432.         current->filename = next->filename = entry->filename;
  2433. --- 3292,3304 ----
  2434.   
  2435.     for (tmp = entry->symbols;
  2436.          tmp < (entry->symbols
  2437. !           + entry->syms_size/sizeof (struct nlist));
  2438.          tmp++)
  2439.       if (tmp->n_type == (int) N_SO)
  2440.         break;
  2441.   
  2442.     if (tmp >= (entry->symbols
  2443. !           + entry->syms_size/sizeof (struct nlist)))
  2444.       {
  2445.         /* I believe this translates to "We lose" */
  2446.         current->filename = next->filename = entry->filename;
  2447. ***************
  2448. *** 2955,2961 ****
  2449.     int use_data_symbols;
  2450.   
  2451.     if (next->sym)
  2452. !     use_data_symbols = (next->sym->n_type & N_TYPE) == N_DATA;
  2453.     else
  2454.       return current->line;
  2455.   
  2456. --- 3356,3362 ----
  2457.     int use_data_symbols;
  2458.   
  2459.     if (next->sym)
  2460. !     use_data_symbols = (next->sym->n_type & ~N_EXT) == N_DATA;
  2461.     else
  2462.       return current->line;
  2463.   
  2464. ***************
  2465. *** 3007,3013 ****
  2466.       *reloc_start = data_segment ? entry->datarel : entry->textrel,
  2467.       *reloc;
  2468.     int reloc_size
  2469. !     = ((data_segment ? entry->header.a_drsize : entry->header.a_trsize)
  2470.          / sizeof (struct relocation_info));
  2471.     int start_of_segment
  2472.       = (data_segment ? entry->data_start_address : entry->text_start_address);
  2473. --- 3408,3414 ----
  2474.       *reloc_start = data_segment ? entry->datarel : entry->textrel,
  2475.       *reloc;
  2476.     int reloc_size
  2477. !     = ((data_segment ? entry->data_reloc_size : entry->text_reloc_size)
  2478.          / sizeof (struct relocation_info));
  2479.     int start_of_segment
  2480.       = (data_segment ? entry->data_start_address : entry->text_start_address);
  2481. ***************
  2482. *** 3014,3023 ****
  2483.     struct nlist *start_of_syms = entry->symbols;
  2484.     struct line_debug_entry *state_pointer
  2485.       = init_debug_scan (data_segment != 0, entry);
  2486. !   register struct line_debug_entry
  2487. !     *current = state_pointer,
  2488. !     *next = state_pointer + 1,
  2489. !     *source = state_pointer + 2;
  2490.     /* Assigned to generally static values; should not be written into.  */
  2491.     char *errfmt;
  2492.     /* Assigned to alloca'd values cand copied into; should be freed
  2493. --- 3415,3421 ----
  2494.     struct nlist *start_of_syms = entry->symbols;
  2495.     struct line_debug_entry *state_pointer
  2496.       = init_debug_scan (data_segment != 0, entry);
  2497. !   register struct line_debug_entry *current = state_pointer;
  2498.     /* Assigned to generally static values; should not be written into.  */
  2499.     char *errfmt;
  2500.     /* Assigned to alloca'd values cand copied into; should be freed
  2501. ***************
  2502. *** 3095,3102 ****
  2503.         /* If errfmt == 0, errmsg has already been defined.  */
  2504.         if (errfmt != 0)
  2505.       {
  2506. !       errmsg = (char *) xmalloc (strlen (errfmt) + strlen (g->name) + 1);
  2507. !       sprintf (errmsg, errfmt, g->name, data_segment ? "data" : "text");
  2508.       }
  2509.   
  2510.         address_to_line (RELOC_ADDRESS (reloc) + start_of_segment,
  2511. --- 3493,3506 ----
  2512.         /* If errfmt == 0, errmsg has already been defined.  */
  2513.         if (errfmt != 0)
  2514.       {
  2515. !       char *nm;
  2516. !       if (!demangler || !(nm = (*demangler)(g->name)))
  2517. !         nm = g->name;
  2518. !       errmsg = xmalloc (strlen (errfmt) + strlen (nm) + 1);
  2519. !       sprintf (errmsg, errfmt, nm, data_segment ? "data" : "text");
  2520. !       if (nm != g->name)
  2521. !         free (nm);
  2522.       }
  2523.   
  2524.         address_to_line (RELOC_ADDRESS (reloc) + start_of_segment,
  2525. ***************
  2526. *** 3103,3112 ****
  2527.                  state_pointer);
  2528.   
  2529.         if (current->line >=0)
  2530. !     fprintf (outfile, "%s:%d: %s\n", current->filename,
  2531. !          invalidate_line_number ? 0 : current->line, errmsg);
  2532.         else
  2533. !     fprintf (outfile, "%s: %s\n", current->filename, errmsg);
  2534.   
  2535.         if (errfmt != 0)
  2536.       free (errmsg);
  2537. --- 3507,3523 ----
  2538.                  state_pointer);
  2539.   
  2540.         if (current->line >=0)
  2541. !     {
  2542. !       fprintf (outfile, "%s:%d (", current->filename,
  2543. !            invalidate_line_number ? 0 : current->line);
  2544. !       print_file_name (entry, outfile);
  2545. !       fprintf (outfile, "): %s\n", errmsg);
  2546. !     }
  2547.         else
  2548. !     {
  2549. !       print_file_name(entry, outfile);
  2550. !       fprintf(outfile, ": %s\n", errmsg);
  2551. !     }
  2552.   
  2553.         if (errfmt != 0)
  2554.       free (errmsg);
  2555. ***************
  2556. *** 3124,3130 ****
  2557.        struct file_entry *entry;
  2558.        FILE *outfile;
  2559.   {
  2560. !   int number_of_syms = entry->header.a_syms / sizeof (struct nlist);
  2561.     unsigned char *nlist_bitvector
  2562.       = (unsigned char *) alloca ((number_of_syms >> 3) + 1);
  2563.     struct line_debug_entry *text_scan, *data_scan;
  2564. --- 3535,3541 ----
  2565.        struct file_entry *entry;
  2566.        FILE *outfile;
  2567.   {
  2568. !   int number_of_syms = entry->syms_size / sizeof (struct nlist);
  2569.     unsigned char *nlist_bitvector
  2570.       = (unsigned char *) alloca ((number_of_syms >> 3) + 1);
  2571.     struct line_debug_entry *text_scan, *data_scan;
  2572. ***************
  2573. *** 3140,3146 ****
  2574.       {
  2575.         int desc;
  2576.   
  2577. !       entry->strings = (char *) alloca (entry->string_size);
  2578.         desc = file_open (entry);
  2579.         read_entry_strings (desc, entry);
  2580.       }
  2581. --- 3551,3557 ----
  2582.       {
  2583.         int desc;
  2584.   
  2585. !       entry->strings = (char *) alloca (entry->strs_size);
  2586.         desc = file_open (entry);
  2587.         read_entry_strings (desc, entry);
  2588.       }
  2589. ***************
  2590. *** 3229,3242 ****
  2591.       continue;
  2592.         
  2593.         if (line_number == -1)
  2594. !     fprintf (outfile, "%s: ", entry->filename);
  2595.         else
  2596. !     fprintf (outfile, "%s:%d: ", file_name, line_number);
  2597.   
  2598.         if (dont_allow_symbol_name)
  2599.       fprintf (outfile, "%s", errfmt);
  2600.         else
  2601.       fprintf (outfile, errfmt, g->name);
  2602.   
  2603.         fputc ('\n', outfile);
  2604.       }
  2605. --- 3640,3670 ----
  2606.       continue;
  2607.   
  2608.         if (line_number == -1)
  2609. !     {
  2610. !       print_file_name (entry, outfile);
  2611. !       fprintf (outfile, ": ");
  2612. !     }
  2613.         else
  2614. !     {
  2615. !       fprintf (outfile, "%s:%d (", file_name, line_number);
  2616. !       print_file_name (entry, outfile);
  2617. !       fprintf (outfile, "): ");
  2618. !     }
  2619.   
  2620.         if (dont_allow_symbol_name)
  2621.       fprintf (outfile, "%s", errfmt);
  2622.         else
  2623. +     {
  2624. +       char *nm;
  2625. +       if (!demangler || !(nm = (*demangler)(g->name)))
  2626.           fprintf (outfile, errfmt, g->name);
  2627. +       else
  2628. +         {
  2629. +           fprintf (outfile, errfmt, nm);
  2630. +           free (nm);
  2631. +         }
  2632. +     }
  2633.   
  2634.         fputc ('\n', outfile);
  2635.       }
  2636. ***************
  2637. *** 3248,3256 ****
  2638.   do_warnings (outfile)
  2639.        FILE *outfile;
  2640.   {
  2641. !   int i;
  2642. !   list_unresolved_refs = !relocatable_output && undefined_global_sym_count;
  2643.     list_warning_symbols = warning_count;
  2644.     list_multiple_defs = multiple_def_count != 0;
  2645.   
  2646. --- 3676,3682 ----
  2647.   do_warnings (outfile)
  2648.        FILE *outfile;
  2649.   {
  2650. !   list_unresolved_refs = output_style != OUTPUT_RELOCATABLE && undefined_global_sym_count;
  2651.     list_warning_symbols = warning_count;
  2652.     list_multiple_defs = multiple_def_count != 0;
  2653.   
  2654. ***************
  2655. *** 3266,3326 ****
  2656.       make_executable = 0;
  2657.   }
  2658.   
  2659. ! /* Write the output file */
  2660. ! void
  2661. ! write_output ()
  2662. ! {
  2663. !   struct stat statbuf;
  2664. !   int filemode;
  2665. !   outdesc = open (output_filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  2666. !   if (outdesc < 0) perror_name (output_filename);
  2667.   
  2668. !   if (fstat (outdesc, &statbuf) < 0)
  2669. !     perror_name (output_filename);
  2670.   
  2671. !   filemode = statbuf.st_mode;
  2672.   
  2673. !   chmod (output_filename, filemode & ~0111);
  2674.   
  2675. !   /* Output the a.out header.  */
  2676. !   write_header ();
  2677.   
  2678. !   /* Output the text and data segments, relocating as we go.  */
  2679. !   write_text ();
  2680. !   write_data ();
  2681.   
  2682. !   /* Output the merged relocation info, if requested with `-r'.  */
  2683. !   if (relocatable_output)
  2684. !     write_rel ();
  2685.   
  2686. !   /* Output the symbol table (both globals and locals).  */
  2687. !   write_syms ();
  2688.   
  2689. !   /* Copy any GDB symbol segments from input files.  */
  2690. !   write_symsegs ();
  2691.   
  2692. !   close (outdesc);
  2693.   
  2694. !   if (chmod (output_filename, filemode | 0111) == -1)
  2695. !     perror_name (output_filename);
  2696.   }
  2697. ! void modify_location (), perform_relocation (), copy_text (), copy_data ();
  2698.   
  2699.   void
  2700. ! write_header ()
  2701.   {
  2702. -   N_SET_MAGIC (outheader, magic);
  2703.     outheader.a_text = text_size;
  2704.   #ifdef sequent
  2705.     outheader.a_text += N_ADDRADJ (outheader);
  2706.   #endif
  2707.     outheader.a_data = data_size;
  2708.     outheader.a_bss = bss_size;
  2709.     outheader.a_entry = (entry_symbol ? entry_symbol->value
  2710. !                : text_start + entry_offset);
  2711.   #ifdef COFF_ENCAPSULATE
  2712.     if (need_coff_header)
  2713.       {
  2714. --- 3692,3795 ----
  2715.       make_executable = 0;
  2716.   }
  2717.   
  2718. ! #ifdef A_OUT
  2719.   
  2720. ! /* Stuff pertaining to creating a.out files. */
  2721.   
  2722. ! /* The a.out header. */
  2723.   
  2724. ! struct exec outheader;
  2725.   
  2726. ! #ifdef COFF_ENCAPSULATE
  2727. ! int need_coff_header;
  2728. ! struct coffheader coffheader;
  2729. ! #endif
  2730.   
  2731. ! /* Compute text_start and text_header_size for an a.out file.  */
  2732.   
  2733. ! void
  2734. ! initialize_a_out_text_start ()
  2735. ! {
  2736. !   int magic;
  2737.   
  2738. !   switch (output_style)
  2739. !     {
  2740. !     case OUTPUT_RELOCATABLE:
  2741. !     case OUTPUT_WRITABLE_TEXT:
  2742. !       magic = OMAGIC;
  2743. !       break;
  2744. !     case OUTPUT_READONLY_TEXT:
  2745. ! #ifdef NMAGIC
  2746. !       magic = NMAGIC;
  2747. !       break;
  2748. ! #endif
  2749. !     case OUTPUT_DEMAND_PAGED:
  2750. !       magic = ZMAGIC;
  2751. !       break;
  2752. !     default:
  2753. !       fatal ("unknown output style found (bug in ld)", (char *) 0);
  2754. !       break;
  2755. !     }
  2756.   
  2757. !   /* Determine whether to count the header as part of
  2758. !      the text size, and initialize the text size accordingly.
  2759. !      This depends on the kind of system and on the output format selected.  */
  2760. !   N_SET_MAGIC (outheader, magic);
  2761. ! #ifdef INITIALIZE_HEADER
  2762. !   INITIALIZE_HEADER;
  2763. ! #endif
  2764.   
  2765. !   text_header_size = sizeof (struct exec);
  2766. ! #ifdef COFF_ENCAPSULATE
  2767. !   /* Don't write the coff header for the output of ld -A (since
  2768. !      it is not executable by the kernel anyway).  */
  2769. !   if (output_style != OUTPUT_RELOCATABLE && !file_table[0].just_syms_flag)
  2770. !     {
  2771. !       need_coff_header = 1;
  2772. !       /* set this flag now, since it will change the values of N_TXTOFF, etc */
  2773. !       N_SET_FLAGS (outheader, N_FLAGS_COFF_ENCAPSULATE);
  2774. !       text_header_size += sizeof (struct coffheader);
  2775. !     }
  2776. ! #endif
  2777. !   if (text_header_size <= N_TXTOFF (outheader))
  2778. !     text_header_size = 0;
  2779. !   else
  2780. !     text_header_size -= N_TXTOFF (outheader);
  2781. ! #ifdef _N_BASEADDR
  2782. !   /* SunOS 4.1 N_TXTADDR depends on the value of outheader.a_entry. */
  2783. !   outheader.a_entry = N_PAGSIZ(outheader);
  2784. ! #endif
  2785.   
  2786. !   if (!T_flag_specified && output_style != OUTPUT_RELOCATABLE)
  2787. !     text_start = N_TXTADDR (outheader);
  2788.   }
  2789. ! /* Compute data_start once text_size is known. */
  2790.   
  2791.   void
  2792. ! initialize_a_out_data_start ()
  2793.   {
  2794.     outheader.a_text = text_size;
  2795.   #ifdef sequent
  2796.     outheader.a_text += N_ADDRADJ (outheader);
  2797. +   if (entry_symbol == 0)
  2798. +     entry_symbol = getsym ("start");
  2799.   #endif
  2800. +   if (! Tdata_flag_specified)
  2801. +     data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
  2802. + }
  2803. + /* Compute offsets of various pieces of the a.out output file.  */
  2804. + void
  2805. + compute_a_out_section_offsets ()
  2806. + {
  2807.     outheader.a_data = data_size;
  2808.     outheader.a_bss = bss_size;
  2809.     outheader.a_entry = (entry_symbol ? entry_symbol->value
  2810. !                : text_start + text_header_size);
  2811.   #ifdef COFF_ENCAPSULATE
  2812.     if (need_coff_header)
  2813.       {
  2814. ***************
  2815. *** 3384,3393 ****
  2816.       }
  2817.   #endif
  2818.   
  2819. - #ifdef INITIALIZE_HEADER
  2820. -   INITIALIZE_HEADER;
  2821. - #endif
  2822.     if (strip_symbols == STRIP_ALL)
  2823.       nsyms = 0;
  2824.     else
  2825. --- 3853,3858 ----
  2826. ***************
  2827. *** 3399,3406 ****
  2828.         else if (discard_locals == DISCARD_NONE)
  2829.       nsyms += local_sym_count;
  2830.         /* One extra for following reference on indirects */
  2831. !       if (relocatable_output)
  2832.       nsyms += set_symbol_count + global_indirect_count;
  2833.       }
  2834.   
  2835.     if (strip_symbols == STRIP_NONE)
  2836. --- 3864,3875 ----
  2837.         else if (discard_locals == DISCARD_NONE)
  2838.       nsyms += local_sym_count;
  2839.         /* One extra for following reference on indirects */
  2840. !       if (output_style == OUTPUT_RELOCATABLE)
  2841. ! #ifndef NeXT
  2842.       nsyms += set_symbol_count + global_indirect_count;
  2843. + #else
  2844. +         nsyms += set_symbol_count;
  2845. + #endif
  2846.       }
  2847.   
  2848.     if (strip_symbols == STRIP_NONE)
  2849. ***************
  2850. *** 3408,3414 ****
  2851.   
  2852.     outheader.a_syms = nsyms * sizeof (struct nlist);
  2853.   
  2854. !   if (relocatable_output)
  2855.       {
  2856.         outheader.a_trsize = text_reloc_size;
  2857.         outheader.a_drsize = data_reloc_size;
  2858. --- 3877,3883 ----
  2859.   
  2860.     outheader.a_syms = nsyms * sizeof (struct nlist);
  2861.   
  2862. !   if (output_style == OUTPUT_RELOCATABLE)
  2863.       {
  2864.         outheader.a_trsize = text_reloc_size;
  2865.         outheader.a_drsize = data_reloc_size;
  2866. ***************
  2867. *** 3419,3428 ****
  2868. --- 3888,3935 ----
  2869.         outheader.a_drsize = 0;
  2870.       }
  2871.   
  2872. +   /* Initialize the various file offsets.  */
  2873. +   output_text_offset = N_TXTOFF (outheader);
  2874. + #ifdef N_DATOFF
  2875. +   output_data_offset = N_DATOFF (outheader);
  2876. + #else
  2877. +   output_data_offset = output_text_offset + text_size;
  2878. + #endif
  2879. + #ifdef N_TRELOFF
  2880. +   output_trel_offset = N_TRELOFF (outheader);
  2881. + #else
  2882. +   output_trel_offset = output_data_offset + data_size;
  2883. + #endif
  2884. + #ifdef N_DRELOFF
  2885. +   output_drel_offset = N_DRELOFF (outheader);
  2886. + #else
  2887. +   output_drel_offset = output_trel_offset + text_reloc_size;
  2888. + #endif
  2889. +   output_syms_offset = N_SYMOFF (outheader);
  2890. +   output_strs_offset = N_STROFF (outheader);
  2891. + }
  2892. + /* Compute more section offsets once the size of the string table is known.  */
  2893. + void
  2894. + compute_more_a_out_section_offsets ()
  2895. + {
  2896. +   output_symseg_offset = output_strs_offset + output_strs_size;
  2897. + }
  2898. + /* Write the a.out header once everything else is known.  */
  2899. + void
  2900. + write_a_out_header ()
  2901. + {
  2902. +   lseek (outdesc, 0L, 0);
  2903.   #ifdef COFF_ENCAPSULATE
  2904.     if (need_coff_header)
  2905.       mywrite (&coffheader, sizeof coffheader, 1, outdesc);
  2906.   #endif
  2907.     mywrite (&outheader, sizeof (struct exec), 1, outdesc);
  2908.   
  2909.     /* Output whatever padding is required in the executable file
  2910. ***************
  2911. *** 3432,3438 ****
  2912. --- 3939,4570 ----
  2913.     padfile (N_TXTOFF (outheader) - sizeof outheader, outdesc);
  2914.   #endif
  2915.   }
  2916. + #endif
  2917. + #ifdef MACH_O
  2918. + /* Stuff pertaining to creating Mach-O files. */
  2919. + /* Convert the Mach-O style n_sect references into something the rest
  2920. +    of the loader can understand.  */
  2921. + void
  2922. + translate_mach_o_symbols (entry)
  2923. +      struct file_entry *entry;
  2924. + {
  2925. +   int i, n, g;
  2926. +   struct nlist *sym;
  2927. +   n = entry->syms_size / sizeof (struct nlist);
  2928. +   for (i = 0; i < n; ++i)
  2929. +     if (((sym = &entry->symbols[i])->n_type & ~N_EXT) == N_SECT)
  2930. +       {
  2931. +     if (sym->n_sect == entry->text_ordinal)
  2932. +       sym->n_type = (sym->n_type & N_EXT) | N_TEXT;
  2933. +     else if (sym->n_sect == entry->data_ordinal)
  2934. +       sym->n_type = (sym->n_type & N_EXT) | N_DATA;
  2935. +     else if (sym->n_sect == entry->bss_ordinal)
  2936. +       sym->n_type = (sym->n_type & N_EXT) | N_BSS;
  2937. +     else
  2938. +       fatal_with_file ("unknown section referenced in symbols of ", entry);
  2939. +     sym->n_sect = 0;
  2940. +       }
  2941. +     else if ((sym = &entry->symbols[i])->n_type == N_SLINE)
  2942. +       {
  2943. +     if (sym->n_sect == entry->text_ordinal)
  2944. +       sym->n_type = N_SLINE;
  2945. +     else if (sym->n_sect == entry->data_ordinal)
  2946. +       sym->n_type = N_DSLINE;
  2947. +     else if (sym->n_sect == entry->bss_ordinal)
  2948. +       sym->n_type = N_BSLINE;
  2949. +     else
  2950. +       fatal_with_file ("unknown section referenced in debugging symbols of ", entry);
  2951. +       }
  2952. + }
  2953. + /* Convert Mach-O style relocation info into a.out style relocation
  2954. +    info internally.  */
  2955. + void
  2956. + translate_mach_o_relocation (entry, reloc, count)
  2957. +      struct file_entry *entry;
  2958. +      struct relocation_info *reloc;
  2959. +      int count;
  2960. + {
  2961. +   int i;
  2962. +   for (i = 0; i < count; ++i)
  2963. +     if (!RELOC_EXTERN_P(&reloc[i]))
  2964. +       if (RELOC_TYPE(&reloc[i]) == R_ABS)
  2965. +     RELOC_TYPE(&reloc[i]) = N_ABS;
  2966. +       else if (RELOC_TYPE(&reloc[i]) == entry->text_ordinal)
  2967. +     RELOC_TYPE(&reloc[i]) = N_TEXT;
  2968. +       else if (RELOC_TYPE(&reloc[i]) == entry->data_ordinal)
  2969. +     RELOC_TYPE(&reloc[i]) = N_DATA;
  2970. +       else if (RELOC_TYPE(&reloc[i]) == entry->bss_ordinal)
  2971. +     RELOC_TYPE(&reloc[i]) = N_BSS;
  2972. +       else
  2973. +     fatal_with_file ("unknown section ordinal in relocation info of ", entry);
  2974. + }
  2975. + /* Header structure for OUTPUT_RELOCATABLE.  */
  2976. + struct
  2977. + {
  2978. +   struct mach_header header;
  2979. +   struct segment_command segment;
  2980. +   struct section text;
  2981. +   struct section data;
  2982. +   struct section bss;
  2983. +   struct symtab_command symtab;
  2984. + #ifdef LC_SYMSEG
  2985. +   struct symseg_command symseg;
  2986. + #endif
  2987. + } m_object;
  2988. + #ifdef NeXT
  2989. + #define CPU_TYPE CPU_TYPE_MC68030
  2990. + #define CPU_SUBTYPE CPU_SUBTYPE_NeXT
  2991. + #define THREAD_FLAVOR NeXT_THREAD_STATE_REGS
  2992. + #define THREAD_COUNT NeXT_THREAD_STATE_REGS_COUNT
  2993. + typedef struct NeXT_thread_state_regs thread_state;
  2994. + #define thread_state_entry_field pc
  2995. + #endif
  2996. + /* Header structure for all executable output forms.  */
  2997. + struct
  2998. + {
  2999. +   struct mach_header header;
  3000. +   struct segment_command pagezero;
  3001. +   struct segment_command text_segment;
  3002. +   struct section text;
  3003. +   struct segment_command data_segment;
  3004. +   struct section data;
  3005. +   struct section bss;
  3006. +   struct thread_command unixthread;
  3007. +   unsigned long int flavor;
  3008. +   unsigned long int count;
  3009. +   thread_state state;
  3010. +   struct symtab_command symtab;
  3011. + #ifdef LC_SYMSEG
  3012. +   struct symseg_command symseg;
  3013. + #endif
  3014. + } m_exec;
  3015. + /* Compute text_start and text_header_size for an a.out file.  */
  3016. + void
  3017. + initialize_mach_o_text_start ()
  3018. + {
  3019. +   if (output_style != OUTPUT_RELOCATABLE)
  3020. +     {
  3021. +       text_header_size = sizeof m_exec;
  3022. +       if (!T_flag_specified && output_style != OUTPUT_RELOCATABLE)
  3023. +     /* We reserve the first page of an executable to trap NULL dereferences.  */
  3024. +     text_start = page_size;
  3025. +     }
  3026. + }
  3027. + /* Compute data_start once text_size is known.  */
  3028. + void
  3029. + initialize_mach_o_data_start ()
  3030. + {
  3031. +   if (! Tdata_flag_specified)
  3032. +     data_start = text_start + text_size;
  3033. + }
  3034. + /* Compute offsets of various pieces of the Mach-O output file.  */
  3035. + void
  3036. + compute_mach_o_section_offsets ()
  3037. + {
  3038. +   int header_size, trsize, drsize;
  3039. +   switch (output_style)
  3040. +     {
  3041. +     case OUTPUT_RELOCATABLE:
  3042. +       header_size = sizeof m_object;
  3043. +       break;
  3044. +     default:
  3045. +       header_size = sizeof m_exec;
  3046. +       break;
  3047. +     }
  3048. +   if (strip_symbols == STRIP_ALL)
  3049. +     nsyms = 0;
  3050. +   else
  3051. +     {
  3052. +       nsyms = (defined_global_sym_count
  3053. +            + undefined_global_sym_count);
  3054. +       if (discard_locals == DISCARD_L)
  3055. +     nsyms += non_L_local_sym_count;
  3056. +       else if (discard_locals == DISCARD_NONE)
  3057. +     nsyms += local_sym_count;
  3058. +       /* One extra for following reference on indirects */
  3059. +       if (output_style == OUTPUT_RELOCATABLE)
  3060. + #ifndef NeXT
  3061. +     nsyms += set_symbol_count + global_indirect_count;
  3062. + #else
  3063. +         nsyms += set_symbol_count;
  3064. + #endif
  3065. +     }
  3066. +   if (strip_symbols == STRIP_NONE)
  3067. +     nsyms += debugger_sym_count;
  3068. +   if (output_style != OUTPUT_RELOCATABLE)
  3069. +     output_text_offset = header_size;
  3070. +   output_data_offset = output_text_offset + text_size;
  3071. +   output_trel_offset = output_data_offset + data_size;
  3072. +   if (output_style == OUTPUT_RELOCATABLE)
  3073. +     trsize = text_reloc_size, drsize = data_reloc_size;
  3074. +   else
  3075. +     trsize = drsize = 0;
  3076. +   output_drel_offset = output_trel_offset + trsize;
  3077. +   output_syms_offset = output_drel_offset + drsize;
  3078. +   output_strs_offset = output_syms_offset + nsyms * sizeof (struct nlist);
  3079. + }
  3080. + /* Compute more section offsets once the size of the string table is known.  */
  3081. + void
  3082. + compute_more_mach_o_section_offsets ()
  3083. + {
  3084. +   output_symseg_offset = output_strs_offset + output_strs_size;
  3085. + }
  3086. + /* Write the Mach-O header once everything else is known.  */
  3087. + void
  3088. + write_mach_o_header ()
  3089. + {
  3090. +   struct mach_header header;
  3091. +   struct section text, data, bss;
  3092. +   struct symtab_command symtab;
  3093. + #ifdef LC_SYMSEG
  3094. +   struct symseg_command symseg;
  3095. + #endif
  3096. +   thread_state state;
  3097. +   lseek (outdesc, 0L, 0);
  3098. +   header.magic = MH_MAGIC;
  3099. +   header.cputype = CPU_TYPE;
  3100. +   header.cpusubtype = CPU_SUBTYPE;
  3101. +   header.filetype = output_style == OUTPUT_RELOCATABLE ? MH_OBJECT : MH_EXECUTE;
  3102. + #ifdef LC_SYMSEG
  3103. +   switch (output_style)
  3104. +     {
  3105. +     case OUTPUT_RELOCATABLE:
  3106. +       header.ncmds = 3;
  3107. +       header.sizeofcmds = sizeof m_object - sizeof header;
  3108. +       break;
  3109. +     default:
  3110. +       header.ncmds = 6;
  3111. +       header.sizeofcmds = sizeof m_exec - sizeof header;
  3112. +       break;
  3113. +     }
  3114. + #else
  3115. +   switch (output_style)
  3116. +     {
  3117. +     case OUTPUT_RELOCATABLE:
  3118. +       header.ncmds = 2;
  3119. +       header.sizeofcmds = sizeof m_object - sizeof header;
  3120. +       break;
  3121. +     default:
  3122. +       header.ncmds = 5;
  3123. +       header.sizeofcmds = sizeof m_exec - sizeof header;
  3124. +       break;
  3125. +     }
  3126. + #endif
  3127. +   header.flags = undefined_global_sym_count ? 0 : MH_NOUNDEFS;
  3128. +   bzero((char *) &text, sizeof text);
  3129. +   strncpy(text.sectname, SECT_TEXT, sizeof text.sectname);
  3130. +   strncpy(text.segname, SEG_TEXT, sizeof text.segname);
  3131. +   text.addr = text_start;
  3132. +   text.size = text_size;
  3133. +   text.offset = output_text_offset;
  3134. +   text.align = text.addr % sizeof (double) ? sizeof (int) : sizeof (double);
  3135. +   text.reloff = output_trel_offset;
  3136. +   text.nreloc = output_style == OUTPUT_RELOCATABLE
  3137. +     ? text_reloc_size / sizeof (struct relocation_info) : 0;
  3138. +   text.flags = 0;
  3139. +   bzero((char *) &data, sizeof data);
  3140. +   strncpy(data.sectname, SECT_DATA, sizeof data.sectname);
  3141. +   strncpy(data.segname, output_style == OUTPUT_WRITABLE_TEXT ? SEG_TEXT : SEG_DATA,
  3142. +       sizeof data.segname);
  3143. +   data.addr = data_start;
  3144. +   data.size = data_size;
  3145. +   data.offset = output_data_offset;
  3146. +   data.align = data.addr % sizeof (double) ? sizeof (int) : sizeof (double);
  3147. +   data.reloff = output_drel_offset;
  3148. +   data.nreloc = output_style == OUTPUT_RELOCATABLE
  3149. +     ? data_reloc_size / sizeof (struct relocation_info) : 0;
  3150. +   data.flags = 0;
  3151. +   bzero((char *) &bss, sizeof bss);
  3152. +   strncpy(bss.sectname, SECT_BSS, sizeof data.sectname);
  3153. +   strncpy(bss.segname, output_style == OUTPUT_WRITABLE_TEXT ? SEG_TEXT : SEG_DATA,
  3154. +       sizeof bss.segname);
  3155. +   bss.addr = data_start + data_size;
  3156. +   bss.size = bss_size;
  3157. +   bss.align = bss.addr % sizeof (double) ? sizeof (int) : sizeof (double);
  3158. +   bss.reloff = 0;
  3159. +   bss.nreloc = 0;
  3160. +   bss.flags = S_ZEROFILL;
  3161. +   symtab.cmd = LC_SYMTAB;
  3162. +   symtab.cmdsize = sizeof symtab;
  3163. +   symtab.symoff = output_syms_offset;
  3164. +   symtab.nsyms = output_syms_size / sizeof (struct nlist);
  3165. +   symtab.stroff = output_strs_offset;
  3166. +   symtab.strsize = output_strs_size;
  3167. + #ifdef LC_SYMSEG
  3168. +   symseg.cmd = LC_SYMSEG;
  3169. +   symseg.cmdsize = sizeof symseg;
  3170. +   symseg.offset = output_symseg_offset;
  3171. +   symseg.size = output_symseg_size;
  3172. + #endif
  3173. +   switch (output_style)
  3174. +     {
  3175. +     case OUTPUT_RELOCATABLE:
  3176. +       m_object.header = header;
  3177. +       m_object.segment.cmd = LC_SEGMENT;
  3178. +       m_object.segment.cmdsize = sizeof (struct segment_command) + 3 * sizeof (struct section);
  3179. +       strncpy(m_object.segment.segname, SEG_TEXT, sizeof m_object.segment.segname);
  3180. +       m_object.segment.vmaddr = 0;
  3181. +       m_object.segment.vmsize = text.size + data.size + bss.size;
  3182. +       m_object.segment.fileoff = text.offset;
  3183. +       m_object.segment.filesize = text.size + data.size;
  3184. +       m_object.segment.maxprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3185. +       m_object.segment.initprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3186. +       m_object.segment.nsects = 3;
  3187. +       m_object.segment.flags = 0;
  3188. +       m_object.text = text;
  3189. +       m_object.data = data;
  3190. +       m_object.bss = bss;
  3191. +       m_object.symtab = symtab;
  3192. + #ifdef LC_SYMSEG
  3193. +       m_object.symseg = symseg;
  3194. + #endif
  3195. +       mywrite((char *) &m_object, 1, sizeof m_object, outdesc);
  3196. +       break;
  3197. +     default:
  3198. +       m_exec.header = header;
  3199. +       m_exec.pagezero.cmd = LC_SEGMENT;
  3200. +       m_exec.pagezero.cmdsize = sizeof (struct segment_command);
  3201. +       strncpy(m_exec.pagezero.segname, SEG_PAGEZERO, sizeof m_exec.pagezero.segname);
  3202. +       m_exec.pagezero.vmaddr = 0;
  3203. +       m_exec.pagezero.vmsize = page_size;
  3204. +       m_exec.pagezero.fileoff = 0;
  3205. +       m_exec.pagezero.filesize = 0;
  3206. +       m_exec.pagezero.maxprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3207. +       m_exec.pagezero.initprot = 0;
  3208. +       m_exec.pagezero.nsects = 0;
  3209. +       m_exec.pagezero.flags = 0;
  3210. +       m_exec.text_segment.cmd = LC_SEGMENT;
  3211. +       m_exec.text_segment.cmdsize = sizeof (struct segment_command) + sizeof (struct section);
  3212. +       strncpy(m_exec.text_segment.segname, SEG_TEXT, sizeof m_exec.text_segment.segname);
  3213. +       m_exec.text_segment.vmaddr = text_start;
  3214. +       m_exec.text_segment.vmsize = text_size;
  3215. +       m_exec.text_segment.fileoff = output_text_offset;
  3216. +       m_exec.text_segment.filesize = text_size;
  3217. +       m_exec.text_segment.maxprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3218. +       m_exec.text_segment.initprot = VM_PROT_READ | VM_PROT_EXECUTE;
  3219. +       if (output_style == OUTPUT_WRITABLE_TEXT)
  3220. +     m_exec.text_segment.initprot |= VM_PROT_WRITE;
  3221. +       m_exec.text_segment.nsects = 1;
  3222. +       m_exec.text_segment.flags = 0;
  3223. +       m_exec.text = text;
  3224. +       m_exec.data_segment.cmd = LC_SEGMENT;
  3225. +       m_exec.data_segment.cmdsize = sizeof (struct segment_command) + 2 * sizeof (struct section);
  3226. +       strncpy(m_exec.data_segment.segname, SEG_DATA, sizeof m_exec.data_segment.segname);
  3227. +       m_exec.data_segment.vmaddr = data_start;
  3228. +       m_exec.data_segment.vmsize = data_size + bss_size;
  3229. +       m_exec.data_segment.fileoff = output_data_offset;
  3230. +       m_exec.data_segment.filesize = data_size;
  3231. +       m_exec.data_segment.maxprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3232. +       m_exec.data_segment.initprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3233. +       m_exec.data_segment.nsects = 2;
  3234. +       m_exec.data_segment.flags = 0;
  3235. +       m_exec.data = data;
  3236. +       m_exec.bss = bss;
  3237. +       m_exec.unixthread.cmd = LC_UNIXTHREAD;
  3238. +       m_exec.unixthread.cmdsize
  3239. +     = sizeof (struct thread_command) + 2 * sizeof (long int) + sizeof (thread_state);
  3240. +       m_exec.flavor = THREAD_FLAVOR;
  3241. +       m_exec.count = THREAD_COUNT;
  3242. +       m_exec.state.thread_state_entry_field = entry_symbol
  3243. +     ? entry_symbol->value : text_start + text_header_size;
  3244. +       m_exec.symtab = symtab;
  3245. + #ifdef LC_SYMSEG
  3246. +       m_exec.symseg = symseg;
  3247. + #endif
  3248. +       mywrite((char *) &m_exec, 1, sizeof m_exec, outdesc);
  3249. +       break;
  3250. +     }
  3251. + }
  3252. + /* Translate a.out style symbols into Mach-O style symbols.  */
  3253. + void
  3254. + generate_mach_o_symbols (syms, nsyms)
  3255. +      struct nlist *syms;
  3256. +      int nsyms;
  3257. + {
  3258. +   int i;
  3259. +   for (i = 0; i < nsyms; ++i)
  3260. +     switch (syms[i].n_type)
  3261. +       {
  3262. +       case N_TEXT:
  3263. +       case N_TEXT | N_EXT:
  3264. +     syms[i].n_type = syms[i].n_type & N_EXT | N_SECT;
  3265. +     syms[i].n_sect = 1;    /* text section ordinal */
  3266. +     break;
  3267. +       case N_DATA:
  3268. +       case N_DATA | N_EXT:
  3269. +     syms[i].n_type = syms[i].n_type & N_EXT | N_SECT;
  3270. +     syms[i].n_sect = 2;    /* data section ordinal */
  3271. +     break;
  3272. +       case N_BSS:
  3273. +       case N_BSS | N_EXT:
  3274. +     syms[i].n_type = syms[i].n_type & N_EXT | N_BSS;
  3275. +     syms[i].n_sect = 3;    /* bss section ordinal */
  3276. +     break;
  3277. +       case N_SLINE:
  3278. +     syms[i].n_type = N_SLINE;
  3279. +     syms[i].n_sect = 1;    /* text section ordinal */
  3280. +     break;
  3281. +       case N_DSLINE:
  3282. +     syms[i].n_type = N_SLINE;
  3283. +     syms[i].n_sect = 2;    /* data section ordinal */
  3284. +     break;
  3285. +       case N_BSLINE:
  3286. +     syms[i].n_type = N_SLINE;
  3287. +     syms[i].n_sect = 3;    /* bss section ordinal */
  3288. +     break;
  3289. +       }
  3290. + }
  3291. + /* Translate a.out style relocation info into Mach-O style relocation
  3292. +    info.  */
  3293. + void
  3294. + generate_mach_o_relocations (reloc, nreloc)
  3295. +      struct relocation_info *reloc;
  3296. +      int nreloc;
  3297. + {
  3298. +   int i;
  3299. +   for (i = 0; i < nreloc; ++i)
  3300. +     if (!RELOC_EXTERN_P (&reloc[i]))
  3301. +       switch (RELOC_TYPE (&reloc[i]))
  3302. +     {
  3303. +     case N_ABS:
  3304. +     case N_ABS | N_EXT:
  3305. +       RELOC_TYPE (&reloc[i]) = R_ABS;
  3306. +       break;
  3307. +     case N_TEXT:
  3308. +     case N_TEXT | N_EXT:
  3309. +       RELOC_TYPE (&reloc[i]) = 1; /* output text section ordinal */
  3310. +       break;
  3311. +     case N_DATA:
  3312. +     case N_DATA | N_EXT:
  3313. +       RELOC_TYPE (&reloc[i]) = 2; /* output data section ordinal */
  3314. +       break;
  3315. +     case N_BSS:
  3316. +     case N_BSS | N_EXT:
  3317. +       RELOC_TYPE (&reloc[i]) = 3; /* output bss section ordinal */
  3318. +       break;
  3319. +     }
  3320. + }
  3321. + #endif
  3322. + /* The following functions are simple switches according to the
  3323. +    output style.  */
  3324. + /* Compute text_start and text_header_size as appropriate for the
  3325. +    output format.  */
  3326. + void
  3327. + initialize_text_start ()
  3328. + {
  3329. + #ifdef A_OUT
  3330. +   if (output_file_type == IS_A_OUT)
  3331. +     {
  3332. +       initialize_a_out_text_start ();
  3333. +       return;
  3334. +     }
  3335. + #endif
  3336. + #ifdef MACH_O
  3337. +   if (output_file_type == IS_MACH_O)
  3338. +     {
  3339. +       initialize_mach_o_text_start ();
  3340. +       return;
  3341. +     }
  3342. + #endif
  3343. +   fatal ("unknown output file type (enum file_type)", (char *) 0);
  3344. + }
  3345. + /* Initialize data_start as appropriate to the output format, once text_size
  3346. +    is known.  */
  3347. + void
  3348. + initialize_data_start ()
  3349. + {
  3350. + #ifdef A_OUT
  3351. +   if (output_file_type == IS_A_OUT)
  3352. +     {
  3353. +       initialize_a_out_data_start ();
  3354. +       return;
  3355. +     }
  3356. + #endif
  3357. + #ifdef MACH_O
  3358. +   if (output_file_type == IS_MACH_O)
  3359. +     {
  3360. +       initialize_mach_o_data_start ();
  3361. +       return;
  3362. +     }
  3363. + #endif
  3364. +   fatal ("unknown output file type (enum file_type)", (char *) 0);
  3365. + }
  3366. + /* Compute offsets of the various sections within the output file.  */
  3367. + void
  3368. + compute_section_offsets ()
  3369. + {
  3370. + #ifdef A_OUT
  3371. +   if (output_file_type == IS_A_OUT)
  3372. +     {
  3373. +       compute_a_out_section_offsets ();
  3374. +       return;
  3375. +     }
  3376. + #endif
  3377. + #ifdef MACH_O
  3378. +   if (output_file_type == IS_MACH_O)
  3379. +     {
  3380. +       compute_mach_o_section_offsets ();
  3381. +       return;
  3382. +     }
  3383. + #endif
  3384. +   fatal ("unknown output file type (enum file_type)", (char *) 0);
  3385. + }
  3386. + /* Compute more section offsets, once the size of the string table
  3387. +    is finalized.  */
  3388. + void
  3389. + compute_more_section_offsets ()
  3390. + {
  3391. + #ifdef A_OUT
  3392. +   if (output_file_type == IS_A_OUT)
  3393. +     {
  3394. +       compute_more_a_out_section_offsets ();
  3395. +       return;
  3396. +     }
  3397. + #endif
  3398. + #ifdef MACH_O
  3399. +   if (output_file_type == IS_MACH_O)
  3400. +     {
  3401. +       compute_more_mach_o_section_offsets ();
  3402. +       return;
  3403. +     }
  3404. + #endif
  3405. +   fatal ("unknown output file type (enum file_type)", (char *) 0);
  3406. + }
  3407. + /* Write the output file header, once everything is known.  */
  3408. + void
  3409. + write_header ()
  3410. + {
  3411. + #ifdef A_OUT
  3412. +   if (output_file_type == IS_A_OUT)
  3413. +     {
  3414. +       write_a_out_header ();
  3415. +       return;
  3416. +     }
  3417. + #endif
  3418. + #ifdef MACH_O
  3419. +   if (output_file_type == IS_MACH_O)
  3420. +     {
  3421. +       write_mach_o_header ();
  3422. +       return;
  3423. +     }
  3424. + #endif
  3425. +   fatal ("unknown output file type (enum file_type)", (char *) 0);
  3426. + }
  3427. + /* Write the output file */
  3428. + void
  3429. + write_output ()
  3430. + {
  3431. +   struct stat statbuf;
  3432. +   int filemode, mask;
  3433. +   /* Remove the old file in case it is owned by someone else.
  3434. +      This prevents spurious "not owner" error messages.
  3435. +      Don't check for errors from unlink; we don't really care
  3436. +      whether it worked.
  3437. +      Note that this means that if the output file is hard linked,
  3438. +      the other names will still have the old contents.  This is
  3439. +      the way Unix ld works; I'm going to consider it a feature.  */
  3440. +   (void) unlink (output_filename);
  3441. +   
  3442. +   outdesc = open (output_filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  3443. +   if (outdesc < 0) perror_name (output_filename);
  3444. +   if (fstat (outdesc, &statbuf) < 0)
  3445. +     perror_name (output_filename);
  3446. +   filemode = statbuf.st_mode;
  3447. +   chmod (output_filename, filemode & ~0111);
  3448. +   /* Calculate the offsets of the various pieces of the output file.  */
  3449. +   compute_section_offsets ();
  3450. +   /* Output the text and data segments, relocating as we go.  */
  3451. +   write_text ();
  3452. +   write_data ();
  3453. +   /* Output the merged relocation info, if requested with `-r'.  */
  3454. +   if (output_style == OUTPUT_RELOCATABLE)
  3455. +     write_rel ();
  3456. +   /* Output the symbol table (both globals and locals).  */
  3457. +   write_syms ();
  3458. +   /* At this point the total size of the symbol table and string table
  3459. +      are finalized.  */
  3460. +   compute_more_section_offsets ();
  3461. +   /* Copy any GDB symbol segments from input files.  */
  3462. +   write_symsegs ();
  3463. +   /* Now that everything is known about the output file, write its header.  */
  3464. +   write_header ();
  3465. +   close (outdesc);
  3466. +   mask = umask (0);
  3467. +   umask (mask);
  3468. +   if (chmod (output_filename, filemode | (0111 & ~mask)) == -1)
  3469. +     perror_name (output_filename);
  3470. + }
  3471.   
  3472. + void modify_location (), perform_relocation (), copy_text (), copy_data ();
  3473.   /* Relocate the text segment of each input file
  3474.      and write to the output file.  */
  3475.   
  3476. ***************
  3477. *** 3442,3448 ****
  3478.     if (trace_files)
  3479.       fprintf (stderr, "Copying and relocating text:\n\n");
  3480.   
  3481. !   each_full_file (copy_text);
  3482.     file_close ();
  3483.   
  3484.     if (trace_files)
  3485. --- 4574,4582 ----
  3486.     if (trace_files)
  3487.       fprintf (stderr, "Copying and relocating text:\n\n");
  3488.   
  3489. !   lseek (outdesc, output_text_offset + text_header_size, 0);
  3490. !   each_full_file (copy_text, 0);
  3491.     file_close ();
  3492.   
  3493.     if (trace_files)
  3494. ***************
  3495. *** 3451,3469 ****
  3496.     padfile (text_pad, outdesc);
  3497.   }
  3498.   
  3499. - int
  3500. - text_offset (entry)
  3501. -      struct file_entry *entry;
  3502. - {
  3503. -   return entry->starting_offset + N_TXTOFF (entry->header);
  3504. - }
  3505.   /* Read in all of the relocation information */
  3506.   
  3507.   void
  3508.   read_relocation ()
  3509.   {
  3510. !   each_full_file (read_file_relocation);
  3511.   }
  3512.   
  3513.   /* Read in the relocation sections of ENTRY if necessary */
  3514. --- 4585,4596 ----
  3515.     padfile (text_pad, outdesc);
  3516.   }
  3517.   
  3518.   /* Read in all of the relocation information */
  3519.   
  3520.   void
  3521.   read_relocation ()
  3522.   {
  3523. !   each_full_file (read_file_relocation, 0);
  3524.   }
  3525.   
  3526.   /* Read in the relocation sections of ENTRY if necessary */
  3527. ***************
  3528. *** 3479,3490 ****
  3529.     desc = -1;
  3530.     if (!entry->textrel)
  3531.       {
  3532. !       reloc = (struct relocation_info *) xmalloc (entry->header.a_trsize);
  3533.         desc = file_open (entry);
  3534. !       lseek (desc,
  3535. !          text_offset (entry) + entry->header.a_text + entry->header.a_data,
  3536. !          L_SET);
  3537. !       if (entry->header.a_trsize != (read_return = read (desc, reloc, entry->header.a_trsize)))
  3538.       {
  3539.         fprintf (stderr, "Return from read: %d\n", read_return);
  3540.         fatal_with_file ("premature eof in text relocation of ", entry);
  3541. --- 4606,4615 ----
  3542.     desc = -1;
  3543.     if (!entry->textrel)
  3544.       {
  3545. !       reloc = (struct relocation_info *) xmalloc (entry->text_reloc_size);
  3546.         desc = file_open (entry);
  3547. !       lseek (desc, entry->starting_offset + entry->text_reloc_offset, L_SET);
  3548. !       if (entry->text_reloc_size != (read_return = read (desc, reloc, entry->text_reloc_size)))
  3549.       {
  3550.         fprintf (stderr, "Return from read: %d\n", read_return);
  3551.         fatal_with_file ("premature eof in text relocation of ", entry);
  3552. ***************
  3553. *** 3494,3509 ****
  3554.   
  3555.     if (!entry->datarel)
  3556.       {
  3557. !       reloc = (struct relocation_info *) xmalloc (entry->header.a_drsize);
  3558.         if (desc == -1) desc = file_open (entry);
  3559. !       lseek (desc,
  3560. !          text_offset (entry) + entry->header.a_text
  3561. !          + entry->header.a_data + entry->header.a_trsize,
  3562. !          L_SET);
  3563. !       if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
  3564.       fatal_with_file ("premature eof in data relocation of ", entry);
  3565.         entry->datarel = reloc;
  3566.       }
  3567.   }
  3568.   
  3569.   /* Read the text segment contents of ENTRY, relocate them,
  3570. --- 4619,4641 ----
  3571.   
  3572.     if (!entry->datarel)
  3573.       {
  3574. !       reloc = (struct relocation_info *) xmalloc (entry->data_reloc_size);
  3575.         if (desc == -1) desc = file_open (entry);
  3576. !       lseek (desc, entry->starting_offset + entry->data_reloc_offset, L_SET);
  3577. !       if (entry->data_reloc_size != read (desc, reloc, entry->data_reloc_size))
  3578.       fatal_with_file ("premature eof in data relocation of ", entry);
  3579.         entry->datarel = reloc;
  3580.       }
  3581. + #ifdef MACH_O
  3582. +   if (entry->file_type == IS_MACH_O)
  3583. +     {
  3584. +       translate_mach_o_relocation (entry, entry->textrel,
  3585. +                    entry->text_reloc_size / sizeof (struct relocation_info));
  3586. +       translate_mach_o_relocation (entry, entry->datarel,
  3587. +                    entry->data_reloc_size / sizeof (struct relocation_info));
  3588. +     }
  3589. + #endif
  3590.   }
  3591.   
  3592.   /* Read the text segment contents of ENTRY, relocate them,
  3593. ***************
  3594. *** 3525,3536 ****
  3595.   
  3596.     /* Allocate space for the file's text section */
  3597.   
  3598. !   bytes = (char *) alloca (entry->header.a_text);
  3599.   
  3600.     /* Deal with relocation information however is appropriate */
  3601.   
  3602.     if (entry->textrel)  reloc = entry->textrel;
  3603. !   else if (relocatable_output)
  3604.       {
  3605.         read_file_relocation (entry);
  3606.         reloc = entry->textrel;
  3607. --- 4657,4668 ----
  3608.   
  3609.     /* Allocate space for the file's text section */
  3610.   
  3611. !   bytes = (char *) alloca (entry->text_size);
  3612.   
  3613.     /* Deal with relocation information however is appropriate */
  3614.   
  3615.     if (entry->textrel)  reloc = entry->textrel;
  3616. !   else if (output_style == OUTPUT_RELOCATABLE)
  3617.       {
  3618.         read_file_relocation (entry);
  3619.         reloc = entry->textrel;
  3620. ***************
  3621. *** 3537,3563 ****
  3622.       }
  3623.     else
  3624.       {
  3625. !       reloc = (struct relocation_info *) alloca (entry->header.a_trsize);
  3626. !       lseek (desc, text_offset (entry) + entry->header.a_text + entry->header.a_data, 0);
  3627. !       if (entry->header.a_trsize != read (desc, reloc, entry->header.a_trsize))
  3628.       fatal_with_file ("premature eof in text relocation of ", entry);
  3629.       }
  3630.   
  3631.     /* Read the text section into core.  */
  3632.   
  3633. !   lseek (desc, text_offset (entry), 0);
  3634. !   if (entry->header.a_text != read (desc, bytes, entry->header.a_text))
  3635.       fatal_with_file ("premature eof in text section of ", entry);
  3636.   
  3637.     /* Relocate the text according to the text relocation.  */
  3638.   
  3639. !   perform_relocation (bytes, entry->text_start_address, entry->header.a_text,
  3640. !               reloc, entry->header.a_trsize, entry);
  3641.   
  3642.     /* Write the relocated text to the output file.  */
  3643.   
  3644. !   mywrite (bytes, 1, entry->header.a_text, outdesc);
  3645.   }
  3646.   
  3647.   /* Relocate the data segment of each input file
  3648. --- 4669,4699 ----
  3649.       }
  3650.     else
  3651.       {
  3652. !       reloc = (struct relocation_info *) alloca (entry->text_reloc_size);
  3653. !       lseek (desc, entry->starting_offset + entry->text_reloc_offset, L_SET);
  3654. !       if (entry->text_reloc_size != read (desc, reloc, entry->text_reloc_size))
  3655.       fatal_with_file ("premature eof in text relocation of ", entry);
  3656. + #ifdef MACH_O
  3657. +       if (entry->file_type == IS_MACH_O)
  3658. +     translate_mach_o_relocation (entry, reloc,
  3659. +                      entry->text_reloc_size / sizeof (struct relocation_info));
  3660. + #endif
  3661.       }
  3662.   
  3663.     /* Read the text section into core.  */
  3664.   
  3665. !   lseek (desc, entry->starting_offset + entry->text_offset, L_SET);
  3666. !   if (entry->text_size != read (desc, bytes, entry->text_size))
  3667.       fatal_with_file ("premature eof in text section of ", entry);
  3668.   
  3669.     /* Relocate the text according to the text relocation.  */
  3670.   
  3671. !   perform_relocation (bytes, entry->text_start_address - entry->orig_text_address,
  3672. !               entry->text_size, reloc, entry->text_reloc_size, entry);
  3673.   
  3674.     /* Write the relocated text to the output file.  */
  3675.   
  3676. !   mywrite (bytes, 1, entry->text_size, outdesc);
  3677.   }
  3678.   
  3679.   /* Relocate the data segment of each input file
  3680. ***************
  3681. *** 3569,3575 ****
  3682.     if (trace_files)
  3683.       fprintf (stderr, "Copying and relocating data:\n\n");
  3684.   
  3685. !   each_full_file (copy_data);
  3686.     file_close ();
  3687.   
  3688.     /* Write out the set element vectors.  See digest symbols for
  3689. --- 4705,4713 ----
  3690.     if (trace_files)
  3691.       fprintf (stderr, "Copying and relocating data:\n\n");
  3692.   
  3693. !   lseek (outdesc, output_data_offset, 0);
  3694. !   each_full_file (copy_data, 0);
  3695.     file_close ();
  3696.   
  3697.     /* Write out the set element vectors.  See digest symbols for
  3698. ***************
  3699. *** 3603,3612 ****
  3700.   
  3701.     desc = file_open (entry);
  3702.   
  3703. !   bytes = (char *) alloca (entry->header.a_data);
  3704.   
  3705.     if (entry->datarel) reloc = entry->datarel;
  3706. !   else if (relocatable_output)    /* Will need this again */
  3707.       {
  3708.         read_file_relocation (entry);
  3709.         reloc = entry->datarel;
  3710. --- 4741,4750 ----
  3711.   
  3712.     desc = file_open (entry);
  3713.   
  3714. !   bytes = (char *) alloca (entry->data_size);
  3715.   
  3716.     if (entry->datarel) reloc = entry->datarel;
  3717. !   else if (output_style == OUTPUT_RELOCATABLE)    /* Will need this again */
  3718.       {
  3719.         read_file_relocation (entry);
  3720.         reloc = entry->datarel;
  3721. ***************
  3722. *** 3613,3634 ****
  3723.       }
  3724.     else
  3725.       {
  3726. !       reloc = (struct relocation_info *) alloca (entry->header.a_drsize);
  3727. !       lseek (desc, text_offset (entry) + entry->header.a_text
  3728. !          + entry->header.a_data + entry->header.a_trsize,
  3729. !          0);
  3730. !       if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
  3731.       fatal_with_file ("premature eof in data relocation of ", entry);
  3732.       }
  3733.   
  3734. !   lseek (desc, text_offset (entry) + entry->header.a_text, 0);
  3735. !   if (entry->header.a_data != read (desc, bytes, entry->header.a_data))
  3736.       fatal_with_file ("premature eof in data section of ", entry);
  3737.   
  3738. !   perform_relocation (bytes, entry->data_start_address - entry->header.a_text,
  3739. !               entry->header.a_data, reloc, entry->header.a_drsize, entry);
  3740.   
  3741. !   mywrite (bytes, 1, entry->header.a_data, outdesc);
  3742.   }
  3743.   
  3744.   /* Relocate ENTRY's text or data section contents.
  3745. --- 4751,4775 ----
  3746.       }
  3747.     else
  3748.       {
  3749. !       reloc = (struct relocation_info *) alloca (entry->data_reloc_size);
  3750. !       lseek (desc, entry->starting_offset + entry->data_reloc_offset, L_SET);
  3751. !       if (entry->data_reloc_size != read (desc, reloc, entry->data_reloc_size))
  3752.       fatal_with_file ("premature eof in data relocation of ", entry);
  3753. + #ifdef MACH_O
  3754. +       if (entry->file_type == IS_MACH_O)
  3755. +     translate_mach_o_relocation (entry, reloc,
  3756. +                      entry->data_reloc_size / sizeof (struct relocation_info));
  3757. + #endif
  3758.       }
  3759.   
  3760. !   lseek (desc, entry->starting_offset + entry->data_offset, L_SET);
  3761. !   if (entry->data_size != read (desc, bytes, entry->data_size))
  3762.       fatal_with_file ("premature eof in data section of ", entry);
  3763.   
  3764. !   perform_relocation (bytes, entry->data_start_address - entry->orig_data_address,
  3765. !               entry->data_size, reloc, entry->data_reloc_size, entry);
  3766.   
  3767. !   mywrite (bytes, 1, entry->data_size, outdesc);
  3768.   }
  3769.   
  3770.   /* Relocate ENTRY's text or data section contents.
  3771. ***************
  3772. *** 3638,3644 ****
  3773.        in the output file and its address in the input file.
  3774.      RELOC_INFO is the address of the relocation info, in core.
  3775.      RELOC_SIZE is its length in bytes.  */
  3776. ! /* This version is about to be severley hacked by Randy.  Hope it
  3777.      works afterwards. */
  3778.   void
  3779.   perform_relocation (data, pc_relocation, data_size, reloc_info, reloc_size, entry)
  3780. --- 4779,4785 ----
  3781.        in the output file and its address in the input file.
  3782.      RELOC_INFO is the address of the relocation info, in core.
  3783.      RELOC_SIZE is its length in bytes.  */
  3784. ! /* This version is about to be severly hacked by Randy.  Hope it
  3785.      works afterwards. */
  3786.   void
  3787.   perform_relocation (data, pc_relocation, data_size, reloc_info, reloc_size, entry)
  3788. ***************
  3789. *** 3652,3661 ****
  3790.     register struct relocation_info *p = reloc_info;
  3791.     struct relocation_info *end
  3792.       = reloc_info + reloc_size / sizeof (struct relocation_info);
  3793. !   int text_relocation = entry->text_start_address;
  3794. !   int data_relocation = entry->data_start_address - entry->header.a_text;
  3795. !   int bss_relocation
  3796. !     = entry->bss_start_address - entry->header.a_text - entry->header.a_data;
  3797.   
  3798.     for (; p < end; p++)
  3799.       {
  3800. --- 4793,4801 ----
  3801.     register struct relocation_info *p = reloc_info;
  3802.     struct relocation_info *end
  3803.       = reloc_info + reloc_size / sizeof (struct relocation_info);
  3804. !   int text_relocation = entry->text_start_address - entry->orig_text_address;
  3805. !   int data_relocation = entry->data_start_address - entry->orig_data_address;
  3806. !   int bss_relocation = entry->bss_start_address - entry->orig_bss_address;
  3807.   
  3808.     for (; p < end; p++)
  3809.       {
  3810. ***************
  3811. *** 3680,3686 ****
  3812.           sp = (symbol *) sp->value;
  3813.   #endif
  3814.   
  3815. !       if (symindex >= entry->header.a_syms)
  3816.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  3817.   
  3818.         /* If the symbol is undefined, leave it at zero.  */
  3819. --- 4820,4826 ----
  3820.           sp = (symbol *) sp->value;
  3821.   #endif
  3822.   
  3823. !       if (symindex >= entry->syms_size)
  3824.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  3825.   
  3826.         /* If the symbol is undefined, leave it at zero.  */
  3827. ***************
  3828. *** 3698,3713 ****
  3829.   
  3830.       case N_DATA:
  3831.       case N_DATA | N_EXT:
  3832. -       /* A word that points to beginning of the the data section
  3833. -          initially contains not 0 but rather the "address" of that section
  3834. -          in the input file, which is the length of the file's text.  */
  3835.         relocation = data_relocation;
  3836.         break;
  3837.   
  3838.       case N_BSS:
  3839.       case N_BSS | N_EXT:
  3840. -       /* Similarly, an input word pointing to the beginning of the bss
  3841. -          initially contains the length of text plus data of the file.  */
  3842.         relocation = bss_relocation;
  3843.         break;
  3844.   
  3845. --- 4838,4848 ----
  3846. ***************
  3847. *** 3725,3731 ****
  3848.   
  3849.   #ifdef RELOC_ADD_EXTRA
  3850.         relocation += RELOC_ADD_EXTRA(p);
  3851. !       if (relocatable_output)
  3852.       {
  3853.         /* If this RELOC_ADD_EXTRA is 0, it means that the
  3854.            symbol was external and the relocation does not
  3855. --- 4860,4866 ----
  3856.   
  3857.   #ifdef RELOC_ADD_EXTRA
  3858.         relocation += RELOC_ADD_EXTRA(p);
  3859. !       if (output_style == OUTPUT_RELOCATABLE)
  3860.       {
  3861.         /* If this RELOC_ADD_EXTRA is 0, it means that the
  3862.            symbol was external and the relocation does not
  3863. ***************
  3864. *** 3783,3794 ****
  3865. --- 4918,4946 ----
  3866.         break;
  3867.   
  3868.       case 2:
  3869. + #ifdef CROSS_LINKER
  3870. +       /* This is necessary if the host has stricter alignment
  3871. +          than the target.  Too slow to use all the time.
  3872. +          Also doesn't deal with differing byte-order.  */
  3873. +       {
  3874. +         /* Thing to relocate.  */
  3875. +         long thing;
  3876. +         bcopy (data + addr, &thing, sizeof (thing));
  3877.           if (RELOC_MEMORY_SUB_P (p))
  3878. +           relocation -= mask & thing;
  3879. +         else if (RELOC_MEMORY_ADD_P (p))
  3880. +           relocation += mask & thing;
  3881. +         thing = (thing & ~mask) | relocation;
  3882. +         bcopy (&thing, data + addr, sizeof (thing));
  3883. +       }
  3884. + #else /* not CROSS_LINKER */
  3885. +       if (RELOC_MEMORY_SUB_P(p))
  3886.           relocation -= mask & *(long *) (data + addr);
  3887.         else if (RELOC_MEMORY_ADD_P(p))
  3888.           relocation += mask & *(long *) (data + addr);
  3889.         *(long *) (data + addr) &= ~mask;
  3890.         *(long *) (data + addr) |= relocation;
  3891. + #endif /* not CROSS_LINKER */
  3892.         break;
  3893.   
  3894.       default:
  3895. ***************
  3896. *** 3797,3803 ****
  3897.       }
  3898.   }
  3899.   
  3900. ! /* For relocatable_output only: write out the relocation,
  3901.      relocating the addresses-to-be-relocated.  */
  3902.   
  3903.   void coptxtrel (), copdatrel ();
  3904. --- 4949,4955 ----
  3905.       }
  3906.   }
  3907.   
  3908. ! /* For OUTPUT_RELOCATABLE only: write out the relocation,
  3909.      relocating the addresses-to-be-relocated.  */
  3910.   
  3911.   void coptxtrel (), copdatrel ();
  3912. ***************
  3913. *** 3823,3848 ****
  3914.       if (sp->referenced || sp->defined)
  3915.         {
  3916.           sp->def_count = count++;
  3917.           /* Leave room for the reference required by N_INDR, if
  3918.              necessary.  */
  3919.           if ((sp->defined & ~N_EXT) == N_INDR)
  3920.             count++;
  3921.         }
  3922.       }
  3923. !   /* Correct, because if (reloatable_output), we will also be writing
  3924.        whatever indirect blocks we have.  */
  3925.     if (count != defined_global_sym_count
  3926.         + undefined_global_sym_count + global_indirect_count)
  3927.       fatal ("internal error");
  3928.   
  3929.     /* Write out the relocations of all files, remembered from copy_text.  */
  3930.   
  3931. !   each_full_file (coptxtrel);
  3932.   
  3933.     if (trace_files)
  3934.       fprintf (stderr, "\nWriting data relocation:\n\n");
  3935.   
  3936. !   each_full_file (copdatrel);
  3937.   
  3938.     if (trace_files)
  3939.       fprintf (stderr, "\n");
  3940. --- 4975,5009 ----
  3941.       if (sp->referenced || sp->defined)
  3942.         {
  3943.           sp->def_count = count++;
  3944. + #ifndef NeXT
  3945.           /* Leave room for the reference required by N_INDR, if
  3946.              necessary.  */
  3947.           if ((sp->defined & ~N_EXT) == N_INDR)
  3948.             count++;
  3949. + #endif
  3950.         }
  3951.       }
  3952. !   /* Correct, because if (OUTPUT_RELOCATABLE), we will also be writing
  3953.        whatever indirect blocks we have.  */
  3954. + #ifndef NeXT
  3955.     if (count != defined_global_sym_count
  3956.         + undefined_global_sym_count + global_indirect_count)
  3957. + #else
  3958. +   if (count != defined_global_sym_count
  3959. +       + undefined_global_sym_count)
  3960. + #endif
  3961.       fatal ("internal error");
  3962.   
  3963.     /* Write out the relocations of all files, remembered from copy_text.  */
  3964.   
  3965. !   lseek (outdesc, output_trel_offset, 0);
  3966. !   each_full_file (coptxtrel, 0);
  3967.   
  3968.     if (trace_files)
  3969.       fprintf (stderr, "\nWriting data relocation:\n\n");
  3970.   
  3971. !   lseek (outdesc, output_drel_offset, 0);
  3972. !   each_full_file (copdatrel, 0);
  3973.   
  3974.     if (trace_files)
  3975.       fprintf (stderr, "\n");
  3976. ***************
  3977. *** 3853,3862 ****
  3978.        struct file_entry *entry;
  3979.   {
  3980.     register struct relocation_info *p, *end;
  3981. !   register int reloc = entry->text_start_address;
  3982.   
  3983.     p = entry->textrel;
  3984. !   end = (struct relocation_info *) (entry->header.a_trsize + (char *) p);
  3985.     while (p < end)
  3986.       {
  3987.         RELOC_ADDRESS(p) += reloc;
  3988. --- 5014,5023 ----
  3989.        struct file_entry *entry;
  3990.   {
  3991.     register struct relocation_info *p, *end;
  3992. !   register int reloc = entry->text_start_address - text_start;
  3993.   
  3994.     p = entry->textrel;
  3995. !   end = (struct relocation_info *) (entry->text_reloc_size + (char *) p);
  3996.     while (p < end)
  3997.       {
  3998.         RELOC_ADDRESS(p) += reloc;
  3999. ***************
  4000. *** 3868,3874 ****
  4001.                     (((char *)entry->symbols) + symindex))
  4002.                    ->n_un.n_name));
  4003.   
  4004. !       if (symindex >= entry->header.a_syms)
  4005.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  4006.   
  4007.   #ifdef N_INDR
  4008. --- 5029,5035 ----
  4009.                     (((char *)entry->symbols) + symindex))
  4010.                    ->n_un.n_name));
  4011.   
  4012. !       if (symindex >= entry->syms_size)
  4013.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  4014.   
  4015.   #ifdef N_INDR
  4016. ***************
  4017. *** 3883,3889 ****
  4018.         if (symptr->defined)
  4019.           {
  4020.             RELOC_EXTERN_P(p) = 0;
  4021. !           RELOC_SYMBOL(p) = (symptr->defined & N_TYPE);
  4022.   #ifdef RELOC_ADD_EXTRA
  4023.             /* If we aren't going to be adding in the value in
  4024.                memory on the next pass of the loader, then we need
  4025. --- 5044,5050 ----
  4026.         if (symptr->defined)
  4027.           {
  4028.             RELOC_EXTERN_P(p) = 0;
  4029. !           RELOC_SYMBOL(p) = (symptr->defined & ~N_EXT);
  4030.   #ifdef RELOC_ADD_EXTRA
  4031.             /* If we aren't going to be adding in the value in
  4032.                memory on the next pass of the loader, then we need
  4033. ***************
  4034. *** 3896,3909 ****
  4035.         else
  4036.           /* Debugger symbols come first, so have to start this
  4037.              after them.  */
  4038.             RELOC_SYMBOL(p) = (symptr->def_count + nsyms
  4039.                    - defined_global_sym_count
  4040.                    - undefined_global_sym_count
  4041.                    - global_indirect_count);
  4042.       }
  4043.         p++;
  4044.       }
  4045. !   mywrite (entry->textrel, 1, entry->header.a_trsize, outdesc);
  4046.   }
  4047.   
  4048.   void
  4049. --- 5057,5083 ----
  4050.         else
  4051.           /* Debugger symbols come first, so have to start this
  4052.              after them.  */
  4053. + #ifndef NeXT
  4054.             RELOC_SYMBOL(p) = (symptr->def_count + nsyms
  4055.                    - defined_global_sym_count
  4056.                    - undefined_global_sym_count
  4057.                    - global_indirect_count);
  4058. + #else
  4059. +           RELOC_SYMBOL(p) = (symptr->def_count + nsyms
  4060. +                  - defined_global_sym_count
  4061. +                  - undefined_global_sym_count);
  4062. + #endif
  4063.       }
  4064.         p++;
  4065.       }
  4066. ! #ifdef MACH_O
  4067. !   if (output_file_type == IS_MACH_O)
  4068. !     generate_mach_o_relocations(entry->textrel,
  4069. !                 entry->text_reloc_size / sizeof (struct relocation_info));
  4070. ! #endif
  4071. !   mywrite (entry->textrel, 1, entry->text_reloc_size, outdesc);
  4072.   }
  4073.   
  4074.   void
  4075. ***************
  4076. *** 3913,3923 ****
  4077.     register struct relocation_info *p, *end;
  4078.     /* Relocate the address of the relocation.
  4079.        Old address is relative to start of the input file's data section.
  4080. !      New address is relative to start of the output file's data section.  */
  4081. !   register int reloc = entry->data_start_address - text_size;
  4082.   
  4083.     p = entry->datarel;
  4084. !   end = (struct relocation_info *) (entry->header.a_drsize + (char *) p);
  4085.     while (p < end)
  4086.       {
  4087.         RELOC_ADDRESS(p) += reloc;
  4088. --- 5087,5100 ----
  4089.     register struct relocation_info *p, *end;
  4090.     /* Relocate the address of the relocation.
  4091.        Old address is relative to start of the input file's data section.
  4092. !      New address is relative to start of the output file's data section.
  4093. !      So the amount we need to relocate it by is the offset of this
  4094. !      input file's data section within the output file's data section.  */
  4095. !   register int reloc = entry->data_start_address - data_start;
  4096.   
  4097.     p = entry->datarel;
  4098. !   end = (struct relocation_info *) (entry->data_reloc_size + (char *) p);
  4099.     while (p < end)
  4100.       {
  4101.         RELOC_ADDRESS(p) += reloc;
  4102. ***************
  4103. *** 3930,3936 ****
  4104.                    ->n_un.n_name));
  4105.         int symtype;
  4106.   
  4107. !       if (symindex >= entry->header.a_syms)
  4108.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  4109.   
  4110.   #ifdef N_INDR
  4111. --- 5107,5113 ----
  4112.                    ->n_un.n_name));
  4113.         int symtype;
  4114.   
  4115. !       if (symindex >= entry->syms_size)
  4116.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  4117.   
  4118.   #ifdef N_INDR
  4119. ***************
  4120. *** 3939,3945 ****
  4121.           symptr = (symbol *) symptr->value;
  4122.   #endif
  4123.   
  4124. !        symtype = symptr->defined & N_TYPE;
  4125.   
  4126.         if (force_common_definition
  4127.             || symtype == N_DATA || symtype == N_TEXT || symtype == N_ABS)
  4128. --- 5116,5122 ----
  4129.           symptr = (symbol *) symptr->value;
  4130.   #endif
  4131.   
  4132. !       symtype = symptr->defined & ~N_EXT;
  4133.   
  4134.         if (force_common_definition
  4135.             || symtype == N_DATA || symtype == N_TEXT || symtype == N_ABS)
  4136. ***************
  4137. *** 3950,3955 ****
  4138. --- 5127,5133 ----
  4139.         else
  4140.           /* Debugger symbols come first, so have to start this
  4141.              after them.  */
  4142. + #ifndef NeXT
  4143.           RELOC_SYMBOL(p)
  4144.             = (((symbol *)
  4145.             (((struct nlist *)
  4146. ***************
  4147. *** 3959,3985 ****
  4148.            + nsyms - defined_global_sym_count
  4149.            - undefined_global_sym_count
  4150.            - global_indirect_count);
  4151.       }
  4152.         p++;
  4153.       }
  4154. !   mywrite (entry->datarel, 1, entry->header.a_drsize, outdesc);
  4155.   }
  4156.   
  4157.   void write_file_syms ();
  4158.   void write_string_table ();
  4159.   
  4160. - /* Offsets and current lengths of symbol and string tables in output file. */
  4161. - int symbol_table_offset;
  4162. - int symbol_table_len;
  4163. - /* Address in output file where string table starts.  */
  4164. - int string_table_offset;
  4165. - /* Offset within string table
  4166. -    where the strings in `strtab_vector' should be written.  */
  4167. - int string_table_len;
  4168.   /* Total size of string table strings allocated so far,
  4169.      including strings in `strtab_vector'.  */
  4170.   int strtab_size;
  4171. --- 5137,5167 ----
  4172.            + nsyms - defined_global_sym_count
  4173.            - undefined_global_sym_count
  4174.            - global_indirect_count);
  4175. + #else
  4176. +         RELOC_SYMBOL(p)
  4177. +           = (((symbol *)
  4178. +           (((struct nlist *)
  4179. +             (((char *)entry->symbols) + symindex))
  4180. +            ->n_un.n_name))
  4181. +          ->def_count
  4182. +          + nsyms - defined_global_sym_count
  4183. +          - undefined_global_sym_count);
  4184. + #endif
  4185.       }
  4186.         p++;
  4187.       }
  4188. ! #ifdef MACH_O
  4189. !   if (output_file_type == IS_MACH_O)
  4190. !     generate_mach_o_relocations(entry->datarel,
  4191. !                 entry->data_reloc_size / sizeof (struct relocation_info));
  4192. ! #endif
  4193. !   mywrite (entry->datarel, 1, entry->data_reloc_size, outdesc);
  4194.   }
  4195.   
  4196.   void write_file_syms ();
  4197.   void write_string_table ();
  4198.   
  4199.   /* Total size of string table strings allocated so far,
  4200.      including strings in `strtab_vector'.  */
  4201.   int strtab_size;
  4202. ***************
  4203. *** 4022,4028 ****
  4204.   {
  4205.     register int i;
  4206.   
  4207. !   lseek (outdesc, string_table_offset + string_table_len, 0);
  4208.   
  4209.     if (!outstream)
  4210.       outstream = fdopen (outdesc, "w");
  4211. --- 5204,5210 ----
  4212.   {
  4213.     register int i;
  4214.   
  4215. !   lseek (outdesc, output_strs_offset + output_strs_size, 0);
  4216.   
  4217.     if (!outstream)
  4218.       outstream = fdopen (outdesc, "w");
  4219. ***************
  4220. *** 4030,4036 ****
  4221.     for (i = 0; i < strtab_index; i++)
  4222.       {
  4223.         fwrite (strtab_vector[i], 1, strtab_lens[i], outstream);
  4224. !       string_table_len += strtab_lens[i];
  4225.       }
  4226.   
  4227.     fflush (outstream);
  4228. --- 5212,5218 ----
  4229.     for (i = 0; i < strtab_index; i++)
  4230.       {
  4231.         fwrite (strtab_vector[i], 1, strtab_lens[i], outstream);
  4232. !       output_strs_size += strtab_lens[i];
  4233.       }
  4234.   
  4235.     fflush (outstream);
  4236. ***************
  4237. *** 4054,4063 ****
  4238. --- 5236,5251 ----
  4239.        extra struct for each indirect symbol to hold the extra reference
  4240.        following. */
  4241.     struct nlist *buf
  4242. + #ifndef NeXT
  4243.       = (struct nlist *) alloca ((defined_global_sym_count
  4244.                   + undefined_global_sym_count
  4245.                   + global_indirect_count)
  4246.                      * sizeof (struct nlist));
  4247. + #else
  4248. +     = (struct nlist *) alloca ((defined_global_sym_count
  4249. +                 + undefined_global_sym_count)
  4250. +                    * sizeof (struct nlist));
  4251. + #endif
  4252.     /* Pointer for storing into BUF.  */
  4253.     register struct nlist *bufp = buf;
  4254.   
  4255. ***************
  4256. *** 4064,4073 ****
  4257.     /* Size of string table includes the bytes that store the size.  */
  4258.     strtab_size = sizeof strtab_size;
  4259.   
  4260. !   symbol_table_offset = N_SYMOFF (outheader);
  4261. !   symbol_table_len = 0;
  4262. !   string_table_offset = N_STROFF (outheader);
  4263. !   string_table_len = strtab_size;
  4264.   
  4265.     if (strip_symbols == STRIP_ALL)
  4266.       return;
  4267. --- 5252,5259 ----
  4268.     /* Size of string table includes the bytes that store the size.  */
  4269.     strtab_size = sizeof strtab_size;
  4270.   
  4271. !   output_syms_size = 0;
  4272. !   output_strs_size = strtab_size;
  4273.   
  4274.     if (strip_symbols == STRIP_ALL)
  4275.       return;
  4276. ***************
  4277. *** 4096,4102 ****
  4278. --- 5282,5292 ----
  4279.         {
  4280.       struct nlist nl;
  4281.   
  4282. + #ifdef N_SECT
  4283. +     nl.n_sect = 0;
  4284. + #else
  4285.       nl.n_other = 0;
  4286. + #endif
  4287.       nl.n_desc = 0;
  4288.   
  4289.       /* Compute a `struct nlist' for the symbol.  */
  4290. ***************
  4291. *** 4111,4118 ****
  4292.           /* If the target of an indirect symbol has been
  4293.              defined and we are outputting an executable,
  4294.              resolve the indirection; it's no longer needed */
  4295. !         if (!relocatable_output
  4296. !             && ((sp->defined & N_TYPE) == N_INDR)
  4297.               && (((symbol *) sp->value)->defined > 1))
  4298.             {
  4299.               symbol *newsp = (symbol *) sp->value;
  4300. --- 5301,5308 ----
  4301.           /* If the target of an indirect symbol has been
  4302.              defined and we are outputting an executable,
  4303.              resolve the indirection; it's no longer needed */
  4304. !         if (output_style != OUTPUT_RELOCATABLE
  4305. !             && ((sp->defined & ~N_EXT) == N_INDR)
  4306.               && (((symbol *) sp->value)->defined > 1))
  4307.             {
  4308.               symbol *newsp = (symbol *) sp->value;
  4309. ***************
  4310. *** 4152,4188 ****
  4311.           *bufp++ = nl;
  4312.           syms_written++;
  4313.           if (nl.n_type == (N_INDR | N_EXT))
  4314.             {
  4315.           struct nlist xtra_ref;
  4316.           xtra_ref.n_type == N_EXT | N_UNDF;
  4317.           xtra_ref.n_un.n_strx
  4318.             = assign_string_table_index (((symbol *) sp->value)->name);
  4319.           xtra_ref.n_other = 0;
  4320.           xtra_ref.n_desc = 0;
  4321.           xtra_ref.n_value = 0;
  4322.           *bufp++ = xtra_ref;
  4323.           syms_written++;
  4324.             }
  4325.         }
  4326.         }
  4327.   
  4328.     /* Output the buffer full of `struct nlist's.  */
  4329.   
  4330. !   lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
  4331.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  4332. !   symbol_table_len += sizeof (struct nlist) * (bufp - buf);
  4333.   
  4334.     if (syms_written != nsyms)
  4335.       fatal ("internal error: wrong number of symbols written into output file", 0);
  4336.   
  4337. !   if (symbol_table_offset + symbol_table_len != string_table_offset)
  4338. !     fatal ("internal error: inconsistent symbol table length", 0);
  4339.   
  4340. !   /* Now the total string table size is known, so write it.
  4341. !      We are already positioned at the right place in the file.  */
  4342.   
  4343. -   mywrite (&strtab_size, sizeof (int), 1, outdesc);  /* we're at right place */
  4344.     /* Write the strings for the global symbols.  */
  4345.   
  4346.     write_string_table ();
  4347. --- 5342,5389 ----
  4348.           *bufp++ = nl;
  4349.           syms_written++;
  4350.           if (nl.n_type == (N_INDR | N_EXT))
  4351. + #ifndef NeXT
  4352.             {
  4353.           struct nlist xtra_ref;
  4354.           xtra_ref.n_type == N_EXT | N_UNDF;
  4355.           xtra_ref.n_un.n_strx
  4356.             = assign_string_table_index (((symbol *) sp->value)->name);
  4357. + #ifdef N_SECT
  4358. +         xtra_ref.n_sect = 0;
  4359. + #else
  4360.           xtra_ref.n_other = 0;
  4361. + #endif
  4362.           xtra_ref.n_desc = 0;
  4363.           xtra_ref.n_value = 0;
  4364.           *bufp++ = xtra_ref;
  4365.           syms_written++;
  4366.             }
  4367. + #else
  4368. +         nl.n_value = assign_string_table_index (((symbol *) sp->value)->name);
  4369. + #endif
  4370.         }
  4371.         }
  4372.   
  4373. + #ifdef MACH_O
  4374. +   if (output_file_type == IS_MACH_O)
  4375. +     generate_mach_o_symbols(buf, bufp - buf);
  4376. + #endif
  4377.     /* Output the buffer full of `struct nlist's.  */
  4378.   
  4379. !   lseek (outdesc, output_syms_offset + output_syms_size, 0);
  4380.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  4381. !   output_syms_size += sizeof (struct nlist) * (bufp - buf);
  4382.   
  4383.     if (syms_written != nsyms)
  4384.       fatal ("internal error: wrong number of symbols written into output file", 0);
  4385.   
  4386. !   /* Now the total string table size is known, so write it into the
  4387. !      first word of the string table.  */
  4388.   
  4389. !   lseek (outdesc, output_strs_offset, 0);
  4390. !   mywrite (&strtab_size, sizeof (int), 1, outdesc);
  4391.   
  4392.     /* Write the strings for the global symbols.  */
  4393.   
  4394.     write_string_table ();
  4395. ***************
  4396. *** 4200,4215 ****
  4397.        int *syms_written_addr;
  4398.   {
  4399.     register struct nlist *p = entry->symbols;
  4400. !   register struct nlist *end = p + entry->header.a_syms / sizeof (struct nlist);
  4401.   
  4402.     /* Buffer to accumulate all the syms before writing them.
  4403.        It has one extra slot for the local symbol we generate here.  */
  4404.     struct nlist *buf
  4405. !     = (struct nlist *) alloca (entry->header.a_syms + sizeof (struct nlist));
  4406.     register struct nlist *bufp = buf;
  4407.   
  4408.     /* Upper bound on number of syms to be written here.  */
  4409. !   int max_syms = (entry->header.a_syms / sizeof (struct nlist)) + 1;
  4410.   
  4411.     /* Make tables that record, for each symbol, its name and its name's length.
  4412.        The elements are filled in by `assign_string_table_index'.  */
  4413. --- 5401,5416 ----
  4414.        int *syms_written_addr;
  4415.   {
  4416.     register struct nlist *p = entry->symbols;
  4417. !   register struct nlist *end = p + entry->syms_size / sizeof (struct nlist);
  4418.   
  4419.     /* Buffer to accumulate all the syms before writing them.
  4420.        It has one extra slot for the local symbol we generate here.  */
  4421.     struct nlist *buf
  4422. !     = (struct nlist *) alloca (entry->syms_size + sizeof (struct nlist));
  4423.     register struct nlist *bufp = buf;
  4424.   
  4425.     /* Upper bound on number of syms to be written here.  */
  4426. !   int max_syms = (entry->syms_size / sizeof (struct nlist)) + 1;
  4427.   
  4428.     /* Make tables that record, for each symbol, its name and its name's length.
  4429.        The elements are filled in by `assign_string_table_index'.  */
  4430. ***************
  4431. *** 4228,4234 ****
  4432. --- 5429,5439 ----
  4433.         nl.n_un.n_strx = assign_string_table_index (entry->local_sym_name);
  4434.         nl.n_value = entry->text_start_address;
  4435.         nl.n_desc = 0;
  4436. + #ifdef N_SECT
  4437. +       nl.n_sect = 0;
  4438. + #else
  4439.         nl.n_other = 0;
  4440. + #endif
  4441.         *bufp++ = nl;
  4442.         (*syms_written_addr)++;
  4443.         entry->local_syms_offset = *syms_written_addr * sizeof (struct nlist);
  4444. ***************
  4445. *** 4236,4242 ****
  4446.   
  4447.     /* Read the file's string table.  */
  4448.   
  4449. !   entry->strings = (char *) alloca (entry->string_size);
  4450.     read_entry_strings (file_open (entry), entry);
  4451.   
  4452.     for (; p < end; p++)
  4453. --- 5441,5447 ----
  4454.   
  4455.     /* Read the file's string table.  */
  4456.   
  4457. !   entry->strings = (char *) alloca (entry->strs_size);
  4458.     read_entry_strings (file_open (entry), entry);
  4459.   
  4460.     for (; p < end; p++)
  4461. ***************
  4462. *** 4251,4257 ****
  4463.                   /* types of symbols are never written */
  4464.                   /* globally, though they are stored */
  4465.                   /* globally.  */
  4466. !         write = relocatable_output;
  4467.         else if (!(type & (N_STAB | N_EXT)))
  4468.           /* ordinary local symbol */
  4469.       write = ((discard_locals != DISCARD_ALL)
  4470. --- 5456,5462 ----
  4471.                   /* types of symbols are never written */
  4472.                   /* globally, though they are stored */
  4473.                   /* globally.  */
  4474. !         write = output_style == OUTPUT_RELOCATABLE;
  4475.         else if (!(type & (N_STAB | N_EXT)))
  4476.           /* ordinary local symbol */
  4477.       write = ((discard_locals != DISCARD_ALL)
  4478. ***************
  4479. *** 4278,4288 ****
  4480.       }
  4481.       }
  4482.   
  4483.     /* All the symbols are now in BUF; write them.  */
  4484.   
  4485. !   lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
  4486.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  4487. !   symbol_table_len += sizeof (struct nlist) * (bufp - buf);
  4488.   
  4489.     /* Write the string-table data for the symbols just written,
  4490.        using the data in vectors `strtab_vector' and `strtab_lens'.  */
  4491. --- 5483,5498 ----
  4492.       }
  4493.       }
  4494.   
  4495. + #ifdef MACH_O
  4496. +   if (output_file_type == IS_MACH_O)
  4497. +     generate_mach_o_symbols(buf, bufp - buf);
  4498. + #endif
  4499.     /* All the symbols are now in BUF; write them.  */
  4500.   
  4501. !   lseek (outdesc, output_syms_offset + output_syms_size, 0);
  4502.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  4503. !   output_syms_size += sizeof (struct nlist) * (bufp - buf);
  4504.   
  4505.     /* Write the string-table data for the symbols just written,
  4506.        using the data in vectors `strtab_vector' and `strtab_lens'.  */
  4507. ***************
  4508. *** 4300,4305 ****
  4509. --- 5510,5516 ----
  4510.   void
  4511.   write_symsegs ()
  4512.   {
  4513. +   lseek (outdesc, output_symseg_offset, 0);
  4514.     each_file (write_file_symseg, 0);
  4515.   }
  4516.   
  4517. ***************
  4518. *** 4309,4320 ****
  4519.   {
  4520.     char buffer[4096];
  4521.     struct symbol_root root;
  4522. !   int indesc;
  4523. !   int len;
  4524.   
  4525. !   if (entry->symseg_offset == 0)
  4526.       return;
  4527.   
  4528.     /* This entry has a symbol segment.  Read the root of the segment.  */
  4529.   
  4530.     indesc = file_open (entry);
  4531. --- 5520,5532 ----
  4532.   {
  4533.     char buffer[4096];
  4534.     struct symbol_root root;
  4535. !   int indesc, len, total;
  4536.   
  4537. !   if (entry->symseg_size == 0)
  4538.       return;
  4539.   
  4540. +   output_symseg_size += entry->symseg_size;
  4541.     /* This entry has a symbol segment.  Read the root of the segment.  */
  4542.   
  4543.     indesc = file_open (entry);
  4544. ***************
  4545. *** 4325,4334 ****
  4546.     /* Store some relocation info into the root.  */
  4547.   
  4548.     root.ldsymoff = entry->local_syms_offset;
  4549. !   root.textrel = entry->text_start_address;
  4550. !   root.datarel = entry->data_start_address - entry->header.a_text;
  4551. !   root.bssrel = entry->bss_start_address
  4552. !     - entry->header.a_text - entry->header.a_data;
  4553.     root.databeg = entry->data_start_address - root.datarel;
  4554.     root.bssbeg = entry->bss_start_address - root.bssrel;
  4555.   
  4556. --- 5537,5545 ----
  4557.     /* Store some relocation info into the root.  */
  4558.   
  4559.     root.ldsymoff = entry->local_syms_offset;
  4560. !   root.textrel = entry->text_start_address - entry->orig_text_address;
  4561. !   root.datarel = entry->data_start_address - entry->orig_data_address;
  4562. !   root.bssrel = entry->bss_start_address - entry->orig_bss_address;
  4563.     root.databeg = entry->data_start_address - root.datarel;
  4564.     root.bssbeg = entry->bss_start_address - root.bssrel;
  4565.   
  4566. ***************
  4567. *** 4338,4349 ****
  4568.   
  4569.     /* Copy the rest of the symbol segment unchanged.  */
  4570.   
  4571. !   if (entry->superfile)
  4572. !     {
  4573. !       /* Library member: number of bytes to copy is determined
  4574. !      from the member's total size.  */
  4575. !       int total = entry->total_size - entry->symseg_offset - sizeof root;
  4576.   
  4577.         while (total > 0)
  4578.       {
  4579. --- 5549,5555 ----
  4580.   
  4581.     /* Copy the rest of the symbol segment unchanged.  */
  4582.   
  4583. !   total = entry->symseg_size - sizeof root;
  4584.   
  4585.     while (total > 0)
  4586.       {
  4587. ***************
  4588. *** 4354,4414 ****
  4589.         total -= len;
  4590.         mywrite (buffer, len, 1, outdesc);
  4591.       }
  4592.       }
  4593.     else
  4594.       {
  4595. !       /* A separate file: copy until end of file.  */
  4596. !       while (len = read (indesc, buffer, sizeof buffer))
  4597. !     {
  4598. !       mywrite (buffer, len, 1, outdesc);
  4599. !       if (len < sizeof buffer)
  4600. !         break;
  4601.       }
  4602.       }
  4603.   
  4604. -   file_close ();
  4605. - }
  4606.   /* Create the symbol table entries for `etext', `edata' and `end'.  */
  4607.   
  4608.   void
  4609.   symtab_init ()
  4610.   {
  4611. ! #ifndef nounderscore
  4612. !   edata_symbol = getsym ("_edata");
  4613. !   etext_symbol = getsym ("_etext");
  4614. !   end_symbol = getsym ("_end");
  4615. ! #else
  4616. !   edata_symbol = getsym ("edata");
  4617. !   etext_symbol = getsym ("etext");
  4618. !   end_symbol = getsym ("end");
  4619. ! #endif
  4620.   
  4621.   #ifdef sun
  4622.     {
  4623. !     symbol *dynamic_symbol = getsym ("__DYNAMIC");
  4624. !     dynamic_symbol->defined = N_ABS | N_EXT;
  4625. !     dynamic_symbol->referenced = 1;
  4626.       dynamic_symbol->value = 0;
  4627.     }
  4628.   #endif
  4629.   #ifdef sequent
  4630.     {
  4631. !     symbol *_387_flt_symbol = getsym ("_387_flt");
  4632. !     _387_flt_symbol->defined = N_ABS | N_EXT;
  4633. !     _387_flt_symbol->referenced = 1;
  4634. !     _387_flt_symbol->value = 0;
  4635.     }
  4636. ! #endif
  4637. !   edata_symbol->defined = N_DATA | N_EXT;
  4638. !   etext_symbol->defined = N_TEXT | N_EXT;
  4639. !   end_symbol->defined = N_BSS | N_EXT;
  4640. !   edata_symbol->referenced = 1;
  4641. !   etext_symbol->referenced = 1;
  4642. !   end_symbol->referenced = 1;
  4643.   }
  4644.   
  4645.   /* Compute the hash code for symbol name KEY.  */
  4646. --- 5560,5646 ----
  4647.         total -= len;
  4648.         mywrite (buffer, len, 1, outdesc);
  4649.       }
  4650. +   file_close ();
  4651. + }
  4652. + /* Define a special symbol (etext, edata, or end).  NAME is the
  4653. +    name of the symbol, with a leading underscore (whether or not this
  4654. +    system uses such underscores).  TYPE is its type (e.g. N_DATA | N_EXT).
  4655. +    Store a symbol * for the symbol in *SYM if SYM is non-NULL.  */
  4656. + static void
  4657. + symbol_define (name, type, sym)
  4658. +      /* const */ char *name;
  4659. +      int type;
  4660. +      symbol **sym;
  4661. + {
  4662. +   symbol *thesym;
  4663. + #if defined(nounderscore)
  4664. +   /* Skip the leading underscore.  */
  4665. +   name++;
  4666. + #endif
  4667. +   thesym = getsym (name);
  4668. +   if (thesym->defined)
  4669. +     {
  4670. +       /* The symbol is defined in some input file.  Don't mess with it.  */
  4671. +       if (sym)
  4672. +     *sym = 0;
  4673.       }
  4674.     else
  4675.       {
  4676. !       if (thesym->referenced)
  4677. !     /* The symbol was not defined, and we are defining it now.  */
  4678. !     undefined_global_sym_count--;
  4679. !       thesym->defined = type;
  4680. !       thesym->referenced = 1;
  4681. !       if (sym)
  4682. !     *sym = thesym;
  4683.       }
  4684.   }
  4685.   
  4686.   /* Create the symbol table entries for `etext', `edata' and `end'.  */
  4687.   
  4688.   void
  4689.   symtab_init ()
  4690.   {
  4691. !   symbol_define ("_edata", N_DATA | N_EXT, &edata_symbol);
  4692. !   symbol_define ("_etext", N_TEXT | N_EXT, &etext_symbol);
  4693. !   symbol_define ("_end", N_BSS | N_EXT, &end_symbol);
  4694. !   /* Either _edata or __edata (C names) is OK as far as ANSI is concerned
  4695. !      (see section 4.1.2.1).  In general, it is best to use __foo and
  4696. !      not worry about the confusing rules for the _foo namespace.
  4697. !      But HPUX 7.0 uses _edata, so we might as weel be consistent.  */
  4698. !   symbol_define ("__edata", N_DATA | N_EXT, &edata_symbol_alt);
  4699. !   symbol_define ("__etext", N_TEXT | N_EXT, &etext_symbol_alt);
  4700. !   symbol_define ("__end", N_BSS | N_EXT, &end_symbol_alt);
  4701.   
  4702.   #ifdef sun
  4703.     {
  4704. !     symbol *dynamic_symbol;
  4705. !     symbol_define ("__DYNAMIC", N_ABS | N_EXT, &dynamic_symbol);
  4706. !     if (dynamic_symbol)
  4707.         dynamic_symbol->value = 0;
  4708.     }
  4709.   #endif
  4710.   #ifdef sequent
  4711.     {
  4712. !     symbol *i387_flt_symbol;
  4713. !     symbol_define ("_387_flt", N_ABS | N_EXT, &i387_flt_symbol);
  4714. !     if (i387_flt_symbol)
  4715. !       i387_flt_symbol->value = 0;
  4716.     }
  4717. ! #endif
  4718. ! #ifdef NeXT
  4719. !   {
  4720. !     symbol *shlib_init_symbol;
  4721. !     symbol_define ("__shared_library_initialization", N_UNDF | N_EXT, &shlib_init_symbol);
  4722. !     if (shlib_init_symbol)
  4723. !       shlib_init_symbol->max_common_size = sizeof (long int);
  4724. !   }
  4725. ! #endif
  4726.   }
  4727.   
  4728.   /* Compute the hash code for symbol name KEY.  */
  4729. ***************
  4730. *** 4495,4500 ****
  4731. --- 5727,5754 ----
  4732.     return 0;
  4733.   }
  4734.   
  4735. + /* Report a usage error.
  4736. +    Like fatal except prints a usage summary.  */
  4737. + void
  4738. + usage (string, arg)
  4739. +      char *string, *arg;
  4740. + {
  4741. +   if (string)
  4742. +     {
  4743. +       fprintf (stderr, "%s: ", progname);
  4744. +       fprintf (stderr, string, arg);
  4745. +       fprintf (stderr, "\n");
  4746. +     }
  4747. +   fprintf (stderr, "\
  4748. + Usage: %s [-d] [-dc] [-dp] [-e symbol] [-l lib] [-n] [-noinhibit-exec]\n\
  4749. +        [-nostdlib] [-o file] [-r] [-s] [-t] [-u symbol] [-x] [-y symbol]\n\
  4750. +        [-z] [-A file] [-Bstatic] [-D size] [-L libdir] [-M] [-N]\n\
  4751. +        [-S] [-T[{text,data}] addr] [-V prefix] [-X] [file...]\n",
  4752. +        progname);
  4753. +   exit (1);
  4754. + }
  4755.   /* Report a fatal error.
  4756.      STRING is a printf format string and ARG is one arg for it.  */
  4757.   
  4758. ***************
  4759. *** 4502,4508 ****
  4760.   fatal (string, arg)
  4761.        char *string, *arg;
  4762.   {
  4763. !   fprintf (stderr, "ld: ");
  4764.     fprintf (stderr, string, arg);
  4765.     fprintf (stderr, "\n");
  4766.     exit (1);
  4767. --- 5756,5762 ----
  4768.   fatal (string, arg)
  4769.        char *string, *arg;
  4770.   {
  4771. !   fprintf (stderr, "%s: ", progname);
  4772.     fprintf (stderr, string, arg);
  4773.     fprintf (stderr, "\n");
  4774.     exit (1);
  4775. ***************
  4776. *** 4516,4522 ****
  4777.        char *string;
  4778.        struct file_entry *entry;
  4779.   {
  4780. !   fprintf (stderr, "ld: ");
  4781.     fprintf (stderr, string);
  4782.     print_file_name (entry, stderr);
  4783.     fprintf (stderr, "\n");
  4784. --- 5770,5776 ----
  4785.        char *string;
  4786.        struct file_entry *entry;
  4787.   {
  4788. !   fprintf (stderr, "%s: ", progname);
  4789.     fprintf (stderr, string);
  4790.     print_file_name (entry, stderr);
  4791.     fprintf (stderr, "\n");
  4792. ***************
  4793. *** 4646,4656 ****
  4794.   
  4795.   /* Like malloc but get fatal error if memory is exhausted.  */
  4796.   
  4797. ! int
  4798.   xmalloc (size)
  4799.        int size;
  4800.   {
  4801. !   register int result = malloc (size);
  4802.     if (!result)
  4803.       fatal ("virtual memory exhausted", 0);
  4804.     return result;
  4805. --- 5900,5910 ----
  4806.   
  4807.   /* Like malloc but get fatal error if memory is exhausted.  */
  4808.   
  4809. ! char *
  4810.   xmalloc (size)
  4811.        int size;
  4812.   {
  4813. !   register char *result = malloc (size);
  4814.     if (!result)
  4815.       fatal ("virtual memory exhausted", 0);
  4816.     return result;
  4817. ***************
  4818. *** 4658,4669 ****
  4819.   
  4820.   /* Like realloc but get fatal error if memory is exhausted.  */
  4821.   
  4822. ! int
  4823.   xrealloc (ptr, size)
  4824.        char *ptr;
  4825.        int size;
  4826.   {
  4827. !   register int result = realloc (ptr, size);
  4828.     if (!result)
  4829.       fatal ("virtual memory exhausted", 0);
  4830.     return result;
  4831. --- 5912,5923 ----
  4832.   
  4833.   /* Like realloc but get fatal error if memory is exhausted.  */
  4834.   
  4835. ! char *
  4836.   xrealloc (ptr, size)
  4837.        char *ptr;
  4838.        int size;
  4839.   {
  4840. !   register char *result = realloc (ptr, size);
  4841.     if (!result)
  4842.       fatal ("virtual memory exhausted", 0);
  4843.     return result;
  4844. ***************
  4845. *** 4690,4693 ****
  4846. --- 5944,5955 ----
  4847.     return (4096);
  4848.   }
  4849.   
  4850. + #endif
  4851. + #if defined(sun) && defined(sparc)
  4852. + int
  4853. + getpagesize ()
  4854. + {
  4855. +   return 8192;
  4856. + }
  4857.   #endif
  4858.